Unused data type with a "deriving" clause is falsely considered used
module M () where data Foo = Bar deriving (Eq)
If there are no explicit references to Foo and none to Bar, the data-type is necessarily unused, so I expect a warning about an unused data-type.
Even if it is referenced, but only from instance declarations, it is necessarily unused in the program.
One potential exception is functional dependencies, where the instance declaration itself has an effect. But even then, perhaps it is worth warning that the *type* is unused.