class Message a data UserMessage = UserMessage deriving(Show) data SystemMessage = SystemMessage deriving (Show) data Something = Something deriving (Show) instance Message UserMessage instance Message SystemMessage data Msg = forall t. (Show t, Message t) => M t instance Show Msg where show (M t) = show t messages :: [Msg] messages = [ M $ UserMessage , M $ SystemMessage --, M $ Something ] main = print $ messages