diff --git a/multirec.cabal b/multirec.cabal
--- a/multirec.cabal
+++ b/multirec.cabal
@@ -1,5 +1,5 @@
 name:			multirec
-version:		0.3
+version:		0.4
 license:		BSD3
 license-file:		LICENSE
 author:			Alexey Rodriguez,
@@ -32,8 +32,7 @@
   .
   *  Alexey Rodriguez, Stefan Holdermans, Andres Löh, Johan Jeuring.
      /Generic programming with fixed points for mutually recursive datatypes/.
-     Technical Report, Universiteit Utrecht
-     (<http://www.cs.uu.nl/research/techreps/repo/CS-2008/2008-019.pdf>).
+     ICFP 2009.
  
 stability:		experimental
 build-type:		Simple
diff --git a/src/Generics/MultiRec.hs b/src/Generics/MultiRec.hs
--- a/src/Generics/MultiRec.hs
+++ b/src/Generics/MultiRec.hs
@@ -11,7 +11,7 @@
 -- multirec --
 -- generic programming for families of recursive datatypes
 -- 
--- This top-level module re-exports all other modules of the library.
+-- This top-level module re-exports most modules of the library.
 --
 -----------------------------------------------------------------------------
 
@@ -24,7 +24,9 @@
     module Generics.MultiRec.HFunctor,
     module Generics.MultiRec.Fold,
     module Generics.MultiRec.Compos,
-    module Generics.MultiRec.Eq
+    module Generics.MultiRec.Eq,
+    module Generics.MultiRec.HFix,
+    module Generics.MultiRec.Show
   )
   where
 
@@ -33,5 +35,7 @@
 import Generics.MultiRec.Fold
 import Generics.MultiRec.Compos
 import Generics.MultiRec.Eq
+import Generics.MultiRec.HFix
+import Generics.MultiRec.Show
 
 
diff --git a/src/Generics/MultiRec/Compos.hs b/src/Generics/MultiRec/Compos.hs
--- a/src/Generics/MultiRec/Compos.hs
+++ b/src/Generics/MultiRec/Compos.hs
@@ -32,14 +32,14 @@
 -- | Normal version.
 compos :: (Fam phi, HFunctor phi (PF phi)) =>
           (forall ix. phi ix -> ix -> ix) -> phi ix -> ix -> ix
-compos f p = to p . hmap (\ p -> I0 . f p . unI0) . from p
+compos f p = to p . hmap (\ p -> I0 . f p . unI0) p . from p
 
 -- | Monadic version of 'compos'.
 composM :: (Fam phi, HFunctor phi (PF phi), Monad m) =>
            (forall ix. phi ix -> ix -> m ix) -> phi ix -> ix -> m ix
-composM f p = liftM (to p) . hmapM (\ p -> liftM I0 . f p . unI0) . from p
+composM f p = liftM (to p) . hmapM (\ p -> liftM I0 . f p . unI0) p . from p
 
 -- | Applicative version of 'compos'.
 composA :: (Fam phi, HFunctor phi (PF phi), Applicative a) =>
            (forall ix. phi ix -> ix -> a ix) -> phi ix -> ix -> a ix
-composA f p = liftA (to p) . hmapA (\ p -> liftA I0 . f p . unI0) . from p
+composA f p = liftA (to p) . hmapA (\ p -> liftA I0 . f p . unI0) p . from p
diff --git a/src/Generics/MultiRec/Fold.hs b/src/Generics/MultiRec/Fold.hs
--- a/src/Generics/MultiRec/Fold.hs
+++ b/src/Generics/MultiRec/Fold.hs
@@ -47,11 +47,11 @@
 
 fold :: (Fam phi, HFunctor phi (PF phi)) =>
         Algebra phi r -> phi ix -> ix -> r ix
-fold f p = f p . hmap (\ p (I0 x) -> fold f p x) . from p
+fold f p = f p . hmap (\ p (I0 x) -> fold f p x) p . from p
 
 foldM :: (Fam phi, HFunctor phi (PF phi), Monad m) =>
          AlgebraF phi m r -> phi ix -> ix -> m (r ix)
-foldM f p x = hmapM (\ p (I0 x) -> foldM f p x) (from p x) >>= f p
+foldM f p x = hmapM (\ p (I0 x) -> foldM f p x) p (from p x) >>= f p
 
 type CoAlgebra'  phi f   r = forall ix. phi ix -> r ix -> f r ix
 type CoAlgebra   phi     r = CoAlgebra' phi (PF phi) r
@@ -60,11 +60,11 @@
 
 unfold :: (Fam phi, HFunctor phi (PF phi)) =>
           CoAlgebra phi r -> phi ix -> r ix -> ix
-unfold f p = to p . hmap (\ p x -> I0 (unfold f p x)) . f p
+unfold f p = to p . hmap (\ p x -> I0 (unfold f p x)) p . f p
 
 unfoldM :: (Fam phi, HFunctor phi (PF phi), Monad m) =>
            CoAlgebraF phi m r -> phi ix -> r ix -> m ix
-unfoldM f p x = f p x >>= liftM (to p) . hmapM (\ p x -> liftM I0 (unfoldM f p x))
+unfoldM f p x = f p x >>= liftM (to p) . hmapM (\ p x -> liftM I0 (unfoldM f p x)) p
 
 type ParaAlgebra'  phi f   r = forall ix. phi ix -> f r ix -> ix -> r ix
 type ParaAlgebra   phi     r = ParaAlgebra' phi (PF phi) r
@@ -73,11 +73,11 @@
 
 para :: (Fam phi, HFunctor phi (PF phi)) => 
         ParaAlgebra phi r -> phi ix -> ix -> r ix
-para f p x = f p (hmap (\ p (I0 x) -> para f p x) (from p x)) x
+para f p x = f p (hmap (\ p (I0 x) -> para f p x) p (from p x)) x
 
 paraM :: (Fam phi, HFunctor phi (PF phi), Monad m) => 
          ParaAlgebraF phi m r -> phi ix -> ix -> m (r ix)
-paraM f p x = hmapM (\ p (I0 x) -> paraM f p x) (from p x) >>= \ r -> f p r x
+paraM f p x = hmapM (\ p (I0 x) -> paraM f p x) p (from p x) >>= \ r -> f p r x
 
 -- * Creating an algebra
 
diff --git a/src/Generics/MultiRec/FoldAlg.hs b/src/Generics/MultiRec/FoldAlg.hs
--- a/src/Generics/MultiRec/FoldAlg.hs
+++ b/src/Generics/MultiRec/FoldAlg.hs
@@ -106,7 +106,7 @@
 fold :: forall phi ix r . (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) =>
         Algebra phi r -> phi ix -> ix -> r ix
 fold f p = alg (f p) .
-           hmap (\ p (I0 x) -> fold f p x) .
+           hmap (\ p (I0 x) -> fold f p x) p .
            from p
 
 -- * Construction of algebras
diff --git a/src/Generics/MultiRec/FoldAlgK.hs b/src/Generics/MultiRec/FoldAlgK.hs
--- a/src/Generics/MultiRec/FoldAlgK.hs
+++ b/src/Generics/MultiRec/FoldAlgK.hs
@@ -105,7 +105,7 @@
 fold :: forall phi ix r . (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) =>
         Algebra phi r -> phi ix -> ix -> r
 fold f p = alg (f p) .
-           hmap (\ p (I0 x) -> K0 (fold f p x)) .
+           hmap (\ p (I0 x) -> K0 (fold f p x)) p .
            from p
 
 -- * Construction of algebras
diff --git a/src/Generics/MultiRec/FoldK.hs b/src/Generics/MultiRec/FoldK.hs
--- a/src/Generics/MultiRec/FoldK.hs
+++ b/src/Generics/MultiRec/FoldK.hs
@@ -38,11 +38,11 @@
 
 fold :: (Fam phi, HFunctor phi (PF phi)) =>
         Algebra phi r -> phi ix -> ix -> r
-fold f p = f p . hmap (\ p (I0 x) -> K0 (fold f p x)) . from p
+fold f p = f p . hmap (\ p (I0 x) -> K0 (fold f p x)) p . from p
 
 foldM :: (Fam phi, HFunctor phi (PF phi), Monad m) =>
          AlgebraF phi m r -> phi ix -> ix -> m r
-foldM f p x = hmapM (\ p (I0 x) -> liftM K0 (foldM f p x)) (from p x) >>= f p
+foldM f p x = hmapM (\ p (I0 x) -> liftM K0 (foldM f p x)) p (from p x) >>= f p
 
 type CoAlgebra'  phi f   r = forall ix. phi ix -> r -> f (K0 r) ix
 type CoAlgebra   phi     r = CoAlgebra' phi (PF phi) r
@@ -51,11 +51,11 @@
 
 unfold :: (Fam phi, HFunctor phi (PF phi)) =>
           CoAlgebra phi r -> phi ix -> r -> ix
-unfold f p = to p . hmap (\ p (K0 x) -> I0 (unfold f p x)) . f p
+unfold f p = to p . hmap (\ p (K0 x) -> I0 (unfold f p x)) p . f p
 
 unfoldM :: (Fam phi, HFunctor phi (PF phi), Monad m) =>
            CoAlgebraF phi m r -> phi ix -> r -> m ix
-unfoldM f p x = f p x >>= liftM (to p) . hmapM (\ p (K0 x) -> liftM I0 (unfoldM f p x))
+unfoldM f p x = f p x >>= liftM (to p) . hmapM (\ p (K0 x) -> liftM I0 (unfoldM f p x)) p
 
 type ParaAlgebra'  phi f   r = forall ix. phi ix -> f (K0 r) ix -> ix -> r
 type ParaAlgebra   phi     r = ParaAlgebra' phi (PF phi) r
@@ -64,11 +64,11 @@
 
 para :: (Fam phi, HFunctor phi (PF phi)) => 
         ParaAlgebra phi r -> phi ix -> ix -> r
-para f p x = f p (hmap (\ p (I0 x) -> K0 (para f p x)) (from p x)) x
+para f p x = f p (hmap (\ p (I0 x) -> K0 (para f p x)) p (from p x)) x
 
 paraM :: (Fam phi, HFunctor phi (PF phi), Monad m) => 
          ParaAlgebraF phi m r -> phi ix -> ix -> m r
-paraM f p x = hmapM (\ p (I0 x) -> liftM K0 (paraM f p x)) (from p x) >>= \ r -> f p r x
+paraM f p x = hmapM (\ p (I0 x) -> liftM K0 (paraM f p x)) p (from p x) >>= \ r -> f p r x
 
 -- * Creating an algebra
 
diff --git a/src/Generics/MultiRec/HFunctor.hs b/src/Generics/MultiRec/HFunctor.hs
--- a/src/Generics/MultiRec/HFunctor.hs
+++ b/src/Generics/MultiRec/HFunctor.hs
@@ -32,29 +32,29 @@
 class HFunctor phi f where
   hmapA :: (Applicative a) =>
            (forall ix. phi ix -> r ix -> a (r' ix)) ->
-           f r ix -> a (f r' ix)
+           phi ix -> f r ix -> a (f r' ix)
 
 instance El phi xi => HFunctor phi (I xi) where
-  hmapA f (I x) = I <$> f proof x
+  hmapA f _ (I x) = I <$> f proof x
 
 instance HFunctor phi (K x) where
-  hmapA _ (K x) = pure (K x)
+  hmapA _ _ (K x) = pure (K x)
 
 instance HFunctor phi U where
-  hmapA _ U = pure U
+  hmapA _ _ U = pure U
 
 instance (HFunctor phi f, HFunctor phi g) => HFunctor phi (f :+: g) where
-  hmapA f (L x) = L <$> hmapA f x
-  hmapA f (R y) = R <$> hmapA f y
+  hmapA f p (L x) = L <$> hmapA f p x
+  hmapA f p (R y) = R <$> hmapA f p y
 
 instance (HFunctor phi f, HFunctor phi g) => HFunctor phi (f :*: g) where
-  hmapA f (x :*: y) = (:*:) <$> hmapA f x <*> hmapA f y
+  hmapA f p (x :*: y) = (:*:) <$> hmapA f p x <*> hmapA f p y
 
 instance HFunctor phi f => HFunctor phi (f :>: ix) where
-  hmapA f (Tag x) = Tag <$> hmapA f x
+  hmapA f p (Tag x) = Tag <$> hmapA f p x
 
 instance (Constructor c, HFunctor phi f) => HFunctor phi (C c f) where
-  hmapA f (C x) = C <$> hmapA f x
+  hmapA f p (C x) = C <$> hmapA f p x
 
 -- | The function 'hmap' takes a functor @f@. All the recursive instances
 -- in that functor are wrapped by an application of @r@. The argument to
@@ -64,11 +64,11 @@
 -- parameterized by a witness of type @phi ix@. 
 hmap  :: (HFunctor phi f) =>
          (forall ix. phi ix -> r ix -> r' ix) ->
-         f r ix -> f r' ix
-hmap f x = unI0 (hmapA (\ ix x -> I0 (f ix x)) x)
+         phi ix -> f r ix -> f r' ix
+hmap f p x = unI0 (hmapA (\ ix x -> I0 (f ix x)) p x)
 
 -- | Monadic version of 'hmap'.
 hmapM :: (HFunctor phi f, Monad m) =>
          (forall ix. phi ix -> r ix -> m (r' ix)) ->
-         f r ix -> m (f r' ix)
-hmapM f x = unwrapMonad (hmapA (\ ix x -> WrapMonad (f ix x)) x)
+         phi ix -> f r ix -> m (f r' ix)
+hmapM f p x = unwrapMonad (hmapA (\ ix x -> WrapMonad (f ix x)) p x)
diff --git a/src/Generics/MultiRec/TH.hs b/src/Generics/MultiRec/TH.hs
--- a/src/Generics/MultiRec/TH.hs
+++ b/src/Generics/MultiRec/TH.hs
@@ -100,10 +100,12 @@
 deriveEqS s ns =
     liftM (:[]) $
     instanceD (cxt []) (conT ''EqS `appT` conT s)
-      [funD 'eqS (map trueClause ns ++ [falseClause])]
+      [funD 'eqS (trues ++ falses)]
   where
     trueClause n = clause [conP n [], conP n []] (normalB (conE 'Just `appE` conE 'Refl)) []
     falseClause  = clause [wildP,  wildP]        (normalB (conE 'Nothing)) []
+    trues        = map trueClause ns
+    falses       = if length trues == 1 then [] else [falseClause]
 
 constrInstance :: Name -> Q [Dec]
 constrInstance n =
@@ -117,9 +119,16 @@
     is <- mapM mkInstance cs
     return $ ds ++ is
 
+stripRecordNames :: Con -> Con
+stripRecordNames (RecC n f) =
+  NormalC n (map (\(_, s, t) -> (s, t)) f)
+stripRecordNames c = c
+
 mkData :: Con -> Q Dec
 mkData (NormalC n _) =
   dataD (cxt []) (mkName (nameBase n)) [] [] [] 
+mkData r@(RecC _ _) =
+  mkData (stripRecordNames r)
 mkData (InfixC t1 n t2) =
   mkData (NormalC n [t1,t2])
 
@@ -136,6 +145,8 @@
 mkInstance (NormalC n _) =
     instanceD (cxt []) (appT (conT ''Constructor) (conT $ mkName (nameBase n)))
       [funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []]]
+mkInstance r@(RecC _ _) =
+  mkInstance (stripRecordNames r)
 mkInstance (InfixC t1 n t2) =
     do
       i <- reify n
@@ -175,6 +186,8 @@
   where
     prod :: Q Type -> Q Type -> Q Type
     prod a b = conT ''(:*:) `appT` a `appT` b
+pfCon ns r@(RecC _ _) =
+  pfCon ns (stripRecordNames r)
 pfCon ns (InfixC t1 n t2) =
     pfCon ns (NormalC n [t1,t2])
 
@@ -233,6 +246,8 @@
       (normalB $ wrap $ lrE m i $ conE 'C `appE` foldr1 prod (zipWith (fromField ns) [0..] (map snd fs))) []
   where
     prod x y = conE '(:*:) `appE` x `appE` y
+fromCon wrap ns n m i r@(RecC _ _) =
+  fromCon wrap ns n m i (stripRecordNames r)
 fromCon wrap ns n m i (InfixC t1 cn t2) =
   fromCon wrap ns n m i (NormalC cn [t1,t2])
 
@@ -248,6 +263,8 @@
       (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) []
   where
     prod x y = conP '(:*:) [x,y]
+toCon wrap ns n m i r@(RecC _ _) =
+  toCon wrap ns n m i (stripRecordNames r)
 toCon wrap ns n m i (InfixC t1 cn t2) =
   toCon wrap ns n m i (NormalC cn [t1,t2])
 
