the current type: data Dynamic = Dynamic TypeRep Obj the new type, if lucky: data Dynamic = Dynamic !(a -> TypeRep) a if unlucky: data TypeableD a = TypeableD (a -> TypeRep) data Dynamic = Dynamic (TypeableD a) a either way, the typeclass approach gives a lot more boxing.