One reason is that if you are only interested in the fact that the class implements the Set interface, then you could change the actual type without affecting how the reference is used.
That is, if for a scenario you just need a simple set of items, then you could make the implementation a HashSet. But if the requirements change, and you need the items in the set to be listed in the order they were entered, you could change the implementation to a LinkedHashSet. If later you decide that you need the set ordered, you could change the implementation to a TreeSet.
But none of those changes have to affect how you use the reference if the type is Set. [ February 12, 2007: Message edited by: Keith Lynn ]