diff --git a/compdata.cabal b/compdata.cabal
--- a/compdata.cabal
+++ b/compdata.cabal
@@ -1,5 +1,5 @@
 Name:			compdata
-Version:		0.5.1
+Version:		0.5.2
 Synopsis:            	Compositional Data Types
 Description:
 
diff --git a/examples/Examples/Param/Lambda.hs b/examples/Examples/Param/Lambda.hs
--- a/examples/Examples/Param/Lambda.hs
+++ b/examples/Examples/Param/Lambda.hs
@@ -92,7 +92,7 @@
                              _                               -> e1 `iPlus` e2
 
 -- * Call-by-value evaluation
-data Monad m => Sem m = Fun (Sem m -> m (Sem m)) | Int Int
+data Sem m = Fun (Sem m -> m (Sem m)) | Int Int
 
 class Monad m => Eval f m where
   evalAlg :: Alg f (m (Sem m))
diff --git a/src/Data/Comp/Annotation.hs b/src/Data/Comp/Annotation.hs
--- a/src/Data/Comp/Annotation.hs
+++ b/src/Data/Comp/Annotation.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE TypeOperators, MultiParamTypeClasses, FlexibleInstances,
-  UndecidableInstances, RankNTypes, GADTs #-}
+  UndecidableInstances, RankNTypes, GADTs, ScopedTypeVariables #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Annotation
@@ -104,5 +104,5 @@
 with an annotation which is then ignored. -}
 -- bug in type checker? below is the inferred type, however, the type checker
 -- rejects it.
--- project' :: (RemA f g, f :<: f1) => Cxt h f1 a -> Maybe (g (Cxt h f1 a))
-project' v = liftM remA $ project v
+project' :: forall f g f1 a h . (RemA f g, f :<: f1) => Cxt h f1 a -> Maybe (g (Cxt h f1 a))
+project' v = liftM remA (project v :: Maybe (f (Cxt h f1 a)))
diff --git a/src/Data/Comp/Automata.hs b/src/Data/Comp/Automata.hs
--- a/src/Data/Comp/Automata.hs
+++ b/src/Data/Comp/Automata.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE RankNTypes, FlexibleContexts, ImplicitParams, GADTs #-}
+{-# LANGUAGE RankNTypes, FlexibleContexts, ImplicitParams, GADTs, TypeOperators #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Automata
diff --git a/src/Data/Comp/Derive/HaskellStrict.hs b/src/Data/Comp/Derive/HaskellStrict.hs
--- a/src/Data/Comp/Derive/HaskellStrict.hs
+++ b/src/Data/Comp/Derive/HaskellStrict.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TemplateHaskell, TypeOperators, CPP #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Derive.HaskellStrict
@@ -76,6 +76,9 @@
       where isFarg fArg (constr, args) = (constr, map (containsStr fArg) args)
             containsStr _ (NotStrict,_) = []
             containsStr fArg (IsStrict,ty) = ty `containsType'` fArg
+#if __GLASGOW_HASKELL__ > 702
+            containsStr fArg (Unpacked,ty) = ty `containsType'` fArg
+#endif
             filterVar _ nonFarg [] x  = nonFarg x
             filterVar farg _ [depth] x = farg depth x
             filterVar _ _ _ _ = error "functor variable occurring twice in argument type"
diff --git a/src/Data/Comp/Derive/Show.hs b/src/Data/Comp/Derive/Show.hs
--- a/src/Data/Comp/Derive/Show.hs
+++ b/src/Data/Comp/Derive/Show.hs
@@ -45,6 +45,7 @@
   return [InstanceD preCond classType [showFDecl]]
       where showFClauses fArg = map (genShowFClause fArg)
             filterFarg fArg ty x = (fArg == ty, varE x)
+            mkShow :: (Bool, ExpQ) -> ExpQ
             mkShow (isFArg, var)
                 | isFArg = var
                 | otherwise = [| show $var |]
diff --git a/src/Data/Comp/Desugar.hs b/src/Data/Comp/Desugar.hs
--- a/src/Data/Comp/Desugar.hs
+++ b/src/Data/Comp/Desugar.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances,
-  UndecidableInstances, OverlappingInstances #-}
+  UndecidableInstances, OverlappingInstances, TypeOperators #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Desugar
diff --git a/src/Data/Comp/Generic.hs b/src/Data/Comp/Generic.hs
--- a/src/Data/Comp/Generic.hs
+++ b/src/Data/Comp/Generic.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE GADTs, ScopedTypeVariables #-}
+{-# LANGUAGE GADTs, ScopedTypeVariables, TypeOperators #-}
 
 --------------------------------------------------------------------------------
 -- |
diff --git a/src/Data/Comp/Multi/Algebra.hs b/src/Data/Comp/Multi/Algebra.hs
--- a/src/Data/Comp/Multi/Algebra.hs
+++ b/src/Data/Comp/Multi/Algebra.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE GADTs, RankNTypes, TypeOperators, ScopedTypeVariables, 
-  FlexibleContexts #-}
+  FlexibleContexts, KindSignatures #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Multi.Algebra
@@ -160,7 +160,7 @@
 
 
 -- | This type represents uniform signature function specification.
-type SigFun f g = forall a. f a :-> g a
+type SigFun f g = forall (a :: * -> *). f a :-> g a
 
 -- | This type represents context function.
 type CxtFun f g = forall h . SigFun (Cxt h f) (Cxt h g)
@@ -225,7 +225,7 @@
 hom f = simpCxt . f
 
 -- | This type represents monadic signature functions.
-type SigFunM m f g = forall a. NatM m (f a) (g a)
+type SigFunM m f g = forall (a :: * -> *) . NatM m (f a) (g a)
 
 
 -- | This type represents monadic context function.
diff --git a/src/Data/Comp/Multi/Annotation.hs b/src/Data/Comp/Multi/Annotation.hs
--- a/src/Data/Comp/Multi/Annotation.hs
+++ b/src/Data/Comp/Multi/Annotation.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE TypeOperators, MultiParamTypeClasses,
-  FlexibleInstances, UndecidableInstances, RankNTypes, GADTs #-}
+  FlexibleInstances, UndecidableInstances, RankNTypes, GADTs, ScopedTypeVariables #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Multi.Annotation
@@ -71,7 +71,5 @@
 
 -- | This function is similar to 'project' but applies to signatures
 -- with an annotation which is then ignored.
-
--- project' :: (RemA s s',s :<: f) =>
---      NatM Maybe (Cxt h f a) (s' (Cxt h f a))
-project' v = liftM remA $ project v
+project' :: forall s s' f h a i . (RemA s s', s :<: f) => Cxt h f a i -> Maybe (s' (Cxt h f a) i)
+project' v = liftM remA (project v :: Maybe (s (Cxt h f a) i))
diff --git a/src/Data/Comp/MultiParam/Algebra.hs b/src/Data/Comp/MultiParam/Algebra.hs
--- a/src/Data/Comp/MultiParam/Algebra.hs
+++ b/src/Data/Comp/MultiParam/Algebra.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE GADTs, RankNTypes, ScopedTypeVariables, TypeOperators,
-  FlexibleContexts, CPP #-}
+  FlexibleContexts, CPP, KindSignatures #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.MultiParam.Algebra
@@ -153,7 +153,7 @@
           run (Var x) = return x
 
 {-| This type represents a signature function. -}
-type SigFun f g = forall a b. f a b :-> g a b
+type SigFun f g = forall (a :: * -> *) (b :: * -> *) . f a b :-> g a b
 
 {-| This type represents a context function. -}
 type CxtFun f g = forall h. SigFun (Cxt h f) (Cxt h g)
@@ -215,7 +215,7 @@
 hom f = simpCxt . f
 
 {-| This type represents a monadic signature function. -}
-type SigFunM m f g = forall a b. NatM m (f a b) (g a b)
+type SigFunM m f g = forall (a :: * -> *) (b :: * -> *) . NatM m (f a b) (g a b)
 
 {-| This type represents a monadic context function. -}
 type CxtFunM m f g = forall h . SigFunM m (Cxt h f) (Cxt h g)
diff --git a/src/Data/Comp/MultiParam/Annotation.hs b/src/Data/Comp/MultiParam/Annotation.hs
--- a/src/Data/Comp/MultiParam/Annotation.hs
+++ b/src/Data/Comp/MultiParam/Annotation.hs
@@ -76,7 +76,5 @@
 
 {-| This function is similar to 'project' but applies to signatures
   with an annotation which is then ignored. -}
--- bug in type checker? below is the inferred type, however, the type checker
--- rejects it.
--- project' :: (RemA f g, f :<: f1) => Cxt h f1 a -> Maybe (g (Cxt h f1 a))
-project' v = liftM remA $ project v
+project' :: forall s s' f a b i h . (RemA s s', s :<: f) =>  Cxt h f a b i -> Maybe (s' a (Cxt h f a b) i)
+project' v = liftM remA (project v :: Maybe (s a (Cxt h f a b) i))
diff --git a/src/Data/Comp/Param/Annotation.hs b/src/Data/Comp/Param/Annotation.hs
--- a/src/Data/Comp/Param/Annotation.hs
+++ b/src/Data/Comp/Param/Annotation.hs
@@ -74,7 +74,6 @@
 
 {-| This function is similar to 'project' but applies to signatures
 with an annotation which is then ignored. -}
--- bug in type checker? below is the inferred type, however, the type checker
--- rejects it.
--- project' :: (RemA f g, f :<: f1) => Cxt h f1 a -> Maybe (g (Cxt h f1 a))
-project' v = liftM remA $ project v
+project' :: forall s s' f h a b .  (RemA s s', s :<: f) => 
+            Cxt h f a b -> Maybe (s' a (Cxt h f a b))
+project' v = liftM remA (project v :: Maybe (s a (Cxt h f a b)))
diff --git a/src/Data/Comp/Param/Desugar.hs b/src/Data/Comp/Param/Desugar.hs
--- a/src/Data/Comp/Param/Desugar.hs
+++ b/src/Data/Comp/Param/Desugar.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances,
-  UndecidableInstances, OverlappingInstances, Rank2Types #-}
+  UndecidableInstances, OverlappingInstances, Rank2Types, TypeOperators #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Param.Desugar
