Jeffrey,
You didn't explain what you're trying to accomplish, and therefore folks can only address the symptoms.
Here's what I'm seeing:
Suppose you have:
data A = A | B | C | D | E
You'd like a function that
given A returns E,
given B, returns D
given C, returns er, C
given D, returns B,
given E, returns A.
So you're hoping to write a Rev type class with singleton member
rev :: Rev a => a -> a
that would do the trick.
Thing is, you can already write a very generic
rev :: (Enum a, Bounded a) => a -> a
that would do the job.