This (phantom type?) trick doesn't pop up any more. Why? class (Repr r, Monad m) => DataRing m r t | r -> m where add :: r t -> r t -> m (r t) ... I believe the point of that was exactly to embed constructors: r (x, y) <-> (r x, r y) I got this out of one of Charette / Kiseljov papers.. Maybe the "finally tagless" papers.