я думал там можно сделать буквально так
class X a b where { a :: a, b :: b, c :: a -> b }
data Y a b = Y { a :: a, b :: b, c :: a -> b }
someMagic :: (X a b => r) -> (Y a b -> r)
и чтобы на что-нибудь отличное по структуре от Y уже ругалось
и чтобы больше ничего писать не пришлось, максимум Generic инстанс