Added Equal instance for any subclass of java.lang.Enum

This uses instance quality (`eq` in Scala, `==` in Java), which is safe due to
the JLS (Java SE 7), §8.9:

  An enum type has no instances other than those defined by its enum constants.
  It is a compile-time error to attempt to explicitly instantiate an enum type
  (§15.9.1).

  [...]

  Because there is only one instance of each enum constant, it is permissible
  to use the == operator in place of the equals method when comparing two
  object references if it is known that at least one of them refers to an enum
  constant.

Contributed by @oxbowlakes
remove dead code
clean up type class product/composition