That's exactly what I was looking for. I pulled the Solid,...,etc definitions out of Layer and replaced the entire Layer definition with this: alias Layer = Algebraic !(Solid, Gradient, Text, Sprite, Plane); and after grepping in the get!(T) method, everything works perfectly. This is a really clean solution, thank you!