Data.Class, to take advantage of the equality and hashing qualities. I would not like to extend each of my classes that model my value objects from the Data.Class class, but rather, extend from an abstract class called ValueObject which in turn, extends from Data.Class, thus being more explicit in my intent. The problem is that I lose any kind of auto-completion when I instantiate an object from my value object, since I cannot pass generics to Data.Class.Data.Class<T> nor Data.Class<{ readonly [P in keyof T]: T[P] }>