On a number of occasions, I've encountered situations where I've wanted to be able to define multiple data types that referenced the same data constructors, without requiring wrapping and unwrapping; while lenses make traversing these sorts of nested data structures easy, I still am not completely comfortable with them, so I went looking for something a bit simpler. The solution that came to me was this:
data X = X
data Y = Y
data Z = Z
-- An algebra over X and Y
data XYAlg a = XYAlg (X -> a) (Y -> a)