diff --git a/compdata-param.cabal b/compdata-param.cabal
--- a/compdata-param.cabal
+++ b/compdata-param.cabal
@@ -1,5 +1,5 @@
 Name:			compdata-param
-Version:		0.8.0.2
+Version:		0.9
 Synopsis:            	Parametric Compositional Data Types
 Description:
 
@@ -89,7 +89,7 @@
                         Data.Comp.Param.Multi.Derive.Injections
                         Data.Comp.Param.Multi.Derive.Projections
 
-  Build-Depends:	base >= 4.7, base < 5, template-haskell, mtl, transformers, compdata >= 0.8 && < 0.10
+  Build-Depends:	base >= 4.7, base < 5, template-haskell, mtl, transformers, compdata >= 0.10 && < 0.11
   hs-source-dirs:	src
   ghc-options:          -W
 
@@ -98,7 +98,7 @@
   Type:                 exitcode-stdio-1.0
   Main-is:		Tests.hs
   hs-source-dirs:	testsuite/tests examples
-  Build-Depends:        base >= 4.7, base < 5, template-haskell, mtl, transformers, compdata >= 0.8 && < 0.10, HUnit,
+  Build-Depends:        base >= 4.7, base < 5, template-haskell, mtl, transformers, compdata >= 0.10 && < 0.11, HUnit,
                         test-framework, test-framework-hunit, containers, compdata-param
 
 source-repository head
diff --git a/src/Data/Comp/Param/Derive/Equality.hs b/src/Data/Comp/Param/Derive/Equality.hs
--- a/src/Data/Comp/Param/Derive/Equality.hs
+++ b/src/Data/Comp/Param/Derive/Equality.hs
@@ -49,7 +49,7 @@
              else
                  [clause [wildP,wildP] (normalB [|return False|]) []]
   eqDDecl <- funD 'eqD (map (eqDClause conArg coArg) constrs' ++ defC)
-  let context = map (\arg -> ClassP ''Eq [arg]) argNames
+  let context = map (\arg -> mkClassP ''Eq [arg]) argNames
   return [InstanceD context classType [eqDDecl]]
       where eqDClause :: Name -> Name -> (Name,[Type]) -> ClauseQ
             eqDClause conArg coArg (constr, args) = do
diff --git a/src/Data/Comp/Param/Derive/Injections.hs b/src/Data/Comp/Param/Derive/Injections.hs
--- a/src/Data/Comp/Param/Derive/Injections.hs
+++ b/src/Data/Comp/Param/Derive/Injections.hs
diff --git a/src/Data/Comp/Param/Derive/Ordering.hs b/src/Data/Comp/Param/Derive/Ordering.hs
--- a/src/Data/Comp/Param/Derive/Ordering.hs
+++ b/src/Data/Comp/Param/Derive/Ordering.hs
@@ -45,7 +45,7 @@
   -- constrs' = [(X,[c]), (Y,[a,c]), (Z,[b -> c])]
   constrs' :: [(Name,[Type])] <- mapM normalConExp constrs
   compareDDecl <- funD 'compareD (compareDClauses conArg coArg constrs')
-  let context = map (\arg -> ClassP ''Ord [arg]) argNames
+  let context = map (\arg -> mkClassP ''Ord [arg]) argNames
   return [InstanceD context classType [compareDDecl]]
       where compareDClauses :: Name -> Name -> [(Name,[Type])] -> [ClauseQ]
             compareDClauses _ _ [] = []
diff --git a/src/Data/Comp/Param/Derive/Projections.hs b/src/Data/Comp/Param/Derive/Projections.hs
--- a/src/Data/Comp/Param/Derive/Projections.hs
+++ b/src/Data/Comp/Param/Derive/Projections.hs
diff --git a/src/Data/Comp/Param/Derive/Show.hs b/src/Data/Comp/Param/Derive/Show.hs
--- a/src/Data/Comp/Param/Derive/Show.hs
+++ b/src/Data/Comp/Param/Derive/Show.hs
@@ -56,7 +56,7 @@
   -- constrs' = [(X,[c]), (Y,[a,c]), (Z,[b -> c])]
   constrs' :: [(Name,[Type])] <- mapM normalConExp constrs
   showDDecl <- funD 'showD (map (showDClause conArg coArg) constrs')
-  let context = map (\arg -> ClassP ''Show [arg]) argNames
+  let context = map (\arg -> mkClassP ''Show [arg]) argNames
   return [InstanceD context classType [showDDecl]]
       where showDClause :: Name -> Name -> (Name,[Type]) -> ClauseQ
             showDClause conArg coArg (constr, args) = do
diff --git a/src/Data/Comp/Param/Derive/SmartConstructors.hs b/src/Data/Comp/Param/Derive/SmartConstructors.hs
--- a/src/Data/Comp/Param/Derive/SmartConstructors.hs
+++ b/src/Data/Comp/Param/Derive/SmartConstructors.hs
diff --git a/src/Data/Comp/Param/Multi/Derive/Equality.hs b/src/Data/Comp/Param/Multi/Derive/Equality.hs
--- a/src/Data/Comp/Param/Multi/Derive/Equality.hs
+++ b/src/Data/Comp/Param/Multi/Derive/Equality.hs
@@ -43,7 +43,7 @@
              else
                  [clause [wildP,wildP] (normalB [|return False|]) []]
   eqHDDecl <- funD 'eqHD (map (eqHDClause conArg coArg) constrs' ++ defC)
-  let context = map (\arg -> ClassP ''Eq [arg]) argNames
+  let context = map (\arg -> mkClassP ''Eq [arg]) argNames
   return [InstanceD context classType [eqHDDecl]]
       where eqHDClause :: Name -> Name -> (Name,[Type]) -> ClauseQ
             eqHDClause conArg coArg (constr, args) = do
diff --git a/src/Data/Comp/Param/Multi/Derive/Ordering.hs b/src/Data/Comp/Param/Multi/Derive/Ordering.hs
--- a/src/Data/Comp/Param/Multi/Derive/Ordering.hs
+++ b/src/Data/Comp/Param/Multi/Derive/Ordering.hs
@@ -44,7 +44,7 @@
   let classType = AppT (ConT ''OrdHD) complType
   constrs' :: [(Name,[Type])] <- mapM normalConExp constrs
   compareHDDecl <- funD 'compareHD (compareHDClauses conArg coArg constrs')
-  let context = map (\arg -> ClassP ''Ord [arg]) argNames
+  let context = map (\arg -> mkClassP ''Ord [arg]) argNames
   return [InstanceD context classType [compareHDDecl]]
       where compareHDClauses :: Name -> Name -> [(Name,[Type])] -> [ClauseQ]
             compareHDClauses _ _ [] = []
diff --git a/src/Data/Comp/Param/Multi/Derive/Show.hs b/src/Data/Comp/Param/Multi/Derive/Show.hs
--- a/src/Data/Comp/Param/Multi/Derive/Show.hs
+++ b/src/Data/Comp/Param/Multi/Derive/Show.hs
@@ -51,7 +51,7 @@
   let classType = AppT (ConT ''ShowHD) complType
   constrs' :: [(Name,[Type])] <- mapM normalConExp constrs
   showHDDecl <- funD 'showHD (map (showHDClause conArg coArg) constrs')
-  let context = map (\arg -> ClassP ''Show [arg]) argNames
+  let context = map (\arg -> mkClassP ''Show [arg]) argNames
   return [InstanceD context classType [showHDDecl]]
       where showHDClause :: Name -> Name -> (Name,[Type]) -> ClauseQ
             showHDClause conArg coArg (constr, args) = do
diff --git a/src/Data/Comp/Param/Multi/Derive/SmartConstructors.hs b/src/Data/Comp/Param/Multi/Derive/SmartConstructors.hs
--- a/src/Data/Comp/Param/Multi/Derive/SmartConstructors.hs
+++ b/src/Data/Comp/Param/Multi/Derive/SmartConstructors.hs
@@ -36,7 +36,7 @@
     liftM concat $ mapM (genSmartConstr (map tyVarBndrName targs) tname) cons
         where iTp iVar (ForallC _ cxt _) =
                   -- Check if the GADT phantom type is constrained
-                  case [y | EqualP x y <- cxt, x == VarT iVar] of
+                  case [y | Just (x, y) <- map isEqualP cxt, x == VarT iVar] of
                     [] -> Nothing
                     tp:_ -> Just tp
               iTp _ _ = Nothing
diff --git a/src/Data/Comp/Param/Multi/HDifunctor.hs b/src/Data/Comp/Param/Multi/HDifunctor.hs
--- a/src/Data/Comp/Param/Multi/HDifunctor.hs
+++ b/src/Data/Comp/Param/Multi/HDifunctor.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, Rank2Types,
-  TypeOperators, GADTs #-}
+  TypeOperators, GADTs, IncoherentInstances #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Param.Multi.HDifunctor
diff --git a/src/Data/Comp/Param/Multi/Ops.hs b/src/Data/Comp/Param/Multi/Ops.hs
--- a/src/Data/Comp/Param/Multi/Ops.hs
+++ b/src/Data/Comp/Param/Multi/Ops.hs
@@ -72,12 +72,12 @@
 infixr 8 :*:
 
 -- |Formal product of signatures (higher-order difunctors).
-data (f :*: g) a b = f a b :*: g a b
+data (f :*: g) a b i = f a b i :*: g a b i
 
-ffst :: (f :*: g) a b -> f a b
+ffst :: (f :*: g) a b :-> f a b
 ffst (x :*: _) = x
 
-fsnd :: (f :*: g) a b -> g a b 
+fsnd :: (f :*: g) a b :-> g a b
 fsnd (_ :*: x) = x
 
 
diff --git a/src/Data/Comp/Param/Multi/Term.hs b/src/Data/Comp/Param/Multi/Term.hs
--- a/src/Data/Comp/Param/Multi/Term.hs
+++ b/src/Data/Comp/Param/Multi/Term.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE EmptyDataDecls, GADTs, KindSignatures, Rank2Types,
-  MultiParamTypeClasses, TypeOperators, ScopedTypeVariables #-}
+  MultiParamTypeClasses, TypeOperators, ScopedTypeVariables, IncoherentInstances #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Comp.Param.Multi.Term
