This could be used in propellor to improve compile time errors.

For example, a RevertableProperty is sometimes used where only a regular Property is accepted. In this case, the error could suggest that the user apply setupRevertableProperty to extract the setup side of the RevertableProperty.

And, when a Property HasInfo is provided to ensureProperty, propellor could explain, in the compile error, why it can't let the user do that.

Custom errors need a type class to be used. So, could do something like this:

class NeedsProperty a where
    withProperty :: (Property metatype -> b) -> b

instance NeedsProperty (Property metatype) where withProperty = id

instance TypeError (Text "Use setupRevertableProperty ...")
         => NeedsProperty RevertableProperty where
        withProperty = error "unreachable"

(While propellor needs to be buildable with older versions of ghc, the instance TypeError can just be wrapped in an ifdef to make it only be used by the new ghc.)