¿Probando las propiedades de QuickCheck contra múltiples tipos?

Tengo una clase de tiposAtomic, que define funciones para convertir ciertos tipos a / desde un valor de envoltura (Atom). Me gustaría definir una propiedad QuickCheck que dice: "para todas las instancias deAtomic, cualquier valor puede ser almacenado y recuperado de forma segura ". La propiedad se ve así:

class Atomic a where
    toAtom :: a -> Atom
    fromAtom :: Atom -> Maybe a

prop_AtomIdentity x = fromAtom (toAtom x) == Just x

Sin embargo, si solo trato de ejecutar esa propiedad a través de QuickCheck, simplemente elige una instancia (Bool) y lo prueba. Actualmente estoy trabajando en eso al definir firmas de tipo para cada tipo atómico admitido en la lista de prueba, pero esto es detallado y propenso a errores:

containerTests =
    [ run (prop_AtomIdentity :: Bool -> Bool)
    , run (prop_AtomIdentity :: Word8 -> Bool)
    , run (prop_AtomIdentity :: String -> Bool)
    {- etc -} ]

Estoy tratando de definir una función que hará esto automáticamente:

forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult]
forallAtoms x =
    [ run (x :: Bool -> Bool)
    , run (x :: Word8 -> Bool)
    , run (x :: String -> Bool)
    {- etc -} ]

containerTests = forallAtoms prop_AtomIdentity

Pero falla con un error de comprobación de tipo:

Tests/Containers.hs:33:0:
    Couldn't match expected type `Word8' against inferred type `String'
    In the first argument of `run', namely `(x :: Word8 -> Bool)'
    In the expression: run (x :: Word8 -> Bool)
    In the expression:
        [run (x :: Bool -> Bool), run (x :: Word8 -> Bool),
         run (x :: String -> Bool)]

¿Hay una mejor manera de probar una propiedad de control de calidad contra varios tipos? De lo contrario, ¿se puede hacer que todos los Átomos funcionen o no está soportado por el sistema de tipos?