Мне не совсем понятно, что вы собираетесь здесь делать? DataTypes предназначены для создания объектов. Если вы просто хотите получить типы, вы должны использовать typeOf.
Это работает, например, но дает скорее TypeReps, чем DataTypes (что, я думаю, является правильным)
{-# Language DeriveDataTypeable #-}
import Data.Data
import Data.Typeable
data Foo =
Foo1 { foo1Name :: String}
| Foo2 { foo2Name :: String, foo2Age :: Integer } deriving (Data, Typeable, Show)
datatype = dataTypeOf (undefined :: Foo)
constrs = dataTypeConstrs datatype
fooConstrs = map fromConstr constrs :: [Foo]
foo1Fields = map (gmapQ typeOf) fooConstrs
-- foo1Fields = [[[Char]],[[Char],Integer]]