If, on the other hand, you're making a Data Mapper [*], you probably want to keep the "dirty logic" (whether an object has changed or not) outside your custom "value type" objects. It will make it easier for your mapper to instantiate existing objects without having them become dirty unwittingly, especially if you start adding update triggers.

I am using a Data Mapper, but my mapper uses reflection and puts the data directly into the private fields, bypassing the "dirty logic". It's currently designed so my domain objects keep a map of original values and that is populated when property change events are fired. I think using the value objects will simplify this.