Shouldn't it be laws that "show" must be injective and "read" must be surjective? Without such laws, one could define:

data Foo = Foo
instance Show Foo where
    show _ _ = id
instance Read Foo where
    readPrec = pfail

which should be prevented.