Thanks all, it works fine (see below).

I lamentably try to make the same for show:
> showTypeable :: (Typeable a) => a -> String
> showTypeable x = case cast x of
>                      Just x' -> show x'
>                      Nothing -> ""

Because it really upsets me to add this show constraints to the Equ constructor ;)
what if i want to make an Obs instance with non showable elements, with no intention to show it of course?

Corentin

> instance Typeable1 Obs where
>    typeOf1 _ = mkTyConApp (mkTyCon "Obs") []
 
> (===) :: (Typeable a, Typeable b, Eq b) => a -> b -> Bool
> (===) x y = cast x == Just y
 

> data Obs a where
>     Player   :: Obs Player 
>     Official :: Obs Bool
>     Equ      :: (Eq a, Show a, Typeable a) => Obs a -> Obs a -> Obs Bool
>     Plus     :: (Num a) => Obs a -> Obs a -> Obs a
>     Time     :: (Num a) => Obs a -> Obs a -> Obs a
>     Minus    :: (Num a) => Obs a -> Obs a -> Obs a
>     And      :: Obs Bool -> Obs Bool -> Obs Bool
>     Or       :: Obs Bool -> Obs Bool -> Obs Bool
>     Not      :: Obs Bool -> Obs Bool
>     Konst    :: (Show a, Eq a) => a -> Obs a
 
 
 
> instance Show t => Show (Obs t) where
>     show Player      = "Player"
>     show Official    = "Official"
>     show (Equ a b)   = (show a) ++ " Eq " ++ (show b)
>     show (Plus a b)  = (show a) ++ " Plus " ++ (show b)
>     show (Minus a b) = (show a) ++ " Minus " ++ (show b)
>     show (Time a b)  = (show a) ++ " Time " ++ (show b)
>     show (Konst a)   = " (Konst " ++ (show a) ++ ")"
>     show (And a b)   = (show a) ++ " And " ++ (show b)
>     show (Or a b)    = (show a) ++ " Or " ++ (show b)
>     show (Not a)     = " (Not " ++ (show a) ++ ")"
 
 
> instance Eq t => Eq (Obs t) where
>     Player == Player       = True
>     Official == Official   = True
>     Equ a b == Equ c d     = (a,b) === (c,d)     
>     Plus a b == Plus c d   = (a == c) && (b == d)
>     Minus a b == Minus c d = (a == c) && (b == d)
>     Time a b == Time c d   = (a == c) && (b == d)
>     And a b == And c d     = (a == c) && (b == d)
>     Or a b == Or c d       = (a == c) && (b == d)
>     Not a == Not b         = (a == b)
>     Konst a == Konst b     = a == b
>     _ == _                 = False