Coerce with type families

Agreed with pretty much everything rhendric said. To add to that though: the definition of the ‘Field’ type family still seems more complicated than necessary. I tend to use HKD’s instead. Something along the lines of:

data Valid a 
data Raw a 
-- or just use Data.Functor.Identity and Data.Maybe directly

type family HKD f a where 
   HKD Valid a = a 
   HKD Raw   a = Maybe a

data Test f = Test { field1 :: HKD f Address, field2 :: HKD f PhoneNumber } 

rawInput :: Test Raw 
rawInput = Test (Just myAddress) Nothing

validTest :: Test Valid
validTest = Test myAddress myPhoneNumber