diff --git a/examples/GRose.hs b/examples/GRose.hs
new file mode 100644
--- /dev/null
+++ b/examples/GRose.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE EmptyDataDecls        #-}
+{-# LANGUAGE TemplateHaskell       #-}
+{-# LANGUAGE GADTs                 #-}
+{-# LANGUAGE KindSignatures        #-}
+{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module GRose where
+
+-- Test case for Issue #1.
+
+import Generics.MultiRec.Base
+import Generics.MultiRec.TH
+
+data GRose a = Leaf a | Node [GRose a]
+
+data GRoseF :: * -> * -> * where
+  GRose :: GRoseF a (GRose a)
+
+$(deriveAll ''GRoseF)
+
+-- Desired output:
+--
+-- data Leaf
+-- data Node
+--
+-- instance Constructor Leaf where
+--   conName _ = "Leaf"
+-- instance Constructor Node where
+--   conName _ = "Node"
+--
+-- type instance PF (GRoseF a) =
+--   (:>:) ((:+:) (C Leaf (K a)) (C Node ((:.:) [] (I (GRose a))))) (GRose a)
+--
+-- instance El (GRoseF a) (GRose a) where
+--   proof = GRose
+--
+-- instance Fam (GRoseF a) where
+--
+--   from GRose (Leaf f0) = Tag (L (C (K f0)))
+--   from GRose (Node f0) = Tag (R (C ((D . (fmap (I . I0))) f0)))
+--
+--   to GRose (Tag (L (C f0))) = Leaf (unK f0)
+--   to GRose (Tag (R (C f0))) = Node (((fmap (unI0 . unI)) . unD) f0)
+--
+-- instance EqS (GRoseF a) where
+--   eqS GRose GRose = Just Refl
diff --git a/examples/J.hs b/examples/J.hs
new file mode 100644
--- /dev/null
+++ b/examples/J.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE GADTs                 #-}
+{-# LANGUAGE KindSignatures        #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE TypeOperators         #-}
+{-# LANGUAGE TypeSynonymInstances  #-}
+{-# LANGUAGE EmptyDataDecls        #-}
+{-# LANGUAGE TemplateHaskell       #-}
+{-# LANGUAGE FlexibleInstances     #-}
+
+module J where
+
+import Generics.MultiRec.Base
+import Generics.MultiRec.TH
+
+-- Issue #4 test case
+
+data J a = JJ (a, J a)
+
+data AST :: * -> * -> * where
+  J :: AST a (J a)
+
+$(deriveAll ''AST)
diff --git a/examples/VarTypes.hs b/examples/VarTypes.hs
new file mode 100644
--- /dev/null
+++ b/examples/VarTypes.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE EmptyDataDecls        #-}
+{-# LANGUAGE TemplateHaskell       #-}
+{-# LANGUAGE GADTs                 #-}
+{-# LANGUAGE KindSignatures        #-}
+{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module VarTypes where
+
+import Generics.MultiRec.TH
+
+data Type1 a b = CA a | CB b
+data Type2 c   = CC c | CD
+data Type3     = CE
+
+data TypesF :: * -> * -> * -> * -> * where
+  Type1 :: TypesF a b c (Type1 a b)
+  Type2 :: TypesF a b c (Type2 c)
+  Type3 :: TypesF a b c  Type3
+
+$(deriveAll ''TypesF)
+
diff --git a/multirec.cabal b/multirec.cabal
--- a/multirec.cabal
+++ b/multirec.cabal
@@ -1,5 +1,5 @@
 name:                 multirec
-version:              0.7.7
+version:              0.7.8
 license:              BSD3
 license-file:         LICENSE
 author:               Alexey Rodriguez,
@@ -34,21 +34,12 @@
   *  Alexey Rodriguez, Stefan Holdermans, Andres Löh, Johan Jeuring.
      /Generic programming with fixed points for mutually recursive datatypes/.
      ICFP 2009.
- 
+
 stability:            experimental
 build-type:           Simple
 cabal-version:        >= 1.10
-tested-with:          GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1
-extra-source-files:   examples/All.hs
-                      examples/AST.hs
-                      examples/ASTUse.hs
-                      examples/ASTTHUse.hs
-                      examples/ASTExamples.hs
-                      examples/Single.hs
-                      examples/SingleUse.hs
-                      examples/SingleTHUse.hs
-                      examples/SingleExamples.hs
-                      CREDITS
+tested-with:          GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2
+extra-source-files:   CREDITS
 
 source-repository head
   type:               git
@@ -83,11 +74,22 @@
   default-language:   Haskell2010
 
   build-depends:      base >= 3.0 && < 5,
-                      template-haskell >= 2.4 && < 2.12
+                      template-haskell >= 2.4 && < 2.13
 
 test-suite examples
   type:               exitcode-stdio-1.0
   main-is:            All.hs
+  other-modules:      AST
+                      ASTExamples
+                      ASTTHUse
+                      ASTUse
+                      GRose
+                      J
+                      Single
+                      SingleExamples
+                      SingleTHUse
+                      SingleUse
+                      VarTypes
   hs-source-dirs:     examples
   default-language:   Haskell2010
   build-depends:      base >= 3.0 && < 5,
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
@@ -240,7 +240,9 @@
 -- the same name.
 mkData :: Con -> Q Dec
 mkData (NormalC n _) =
-#if MIN_VERSION_template_haskell(2,11,0)
+#if MIN_VERSION_template_haskell(2,12,0)
+  dataD (cxt []) (remakeName n) [] Nothing [] []
+#elif MIN_VERSION_template_haskell(2,11,0)
   dataD (cxt []) (remakeName n) [] Nothing [] (cxt [])
 #else
   dataD (cxt []) (remakeName n) [] [] []
