diff --git a/GHC/Boot/TH/Ppr.hs b/GHC/Boot/TH/Ppr.hs
--- a/GHC/Boot/TH/Ppr.hs
+++ b/GHC/Boot/TH/Ppr.hs
@@ -398,7 +398,8 @@
             <+> braces (sep $ punctuate comma $
                         map (\(s,p) -> pprName' Applied s <+> equals <+> ppr p) fs)
 pprPat _ (ListP ps) = brackets (commaSep ps)
-pprPat i (SigP p t) = parensIf (i > noPrec) $ ppr p <+> dcolon <+> ppr t
+pprPat i (SigP p t) = parensIf (i > noPrec) $ pprPat sigPrec p
+                                          <+> dcolon <+> pprType sigPrec t
 pprPat _ (ViewP e p) = parens $ pprExp noPrec e <+> text "->" <+> pprPat noPrec p
 pprPat _ (TypeP t) = parens $ text "type" <+> ppr t
 pprPat _ (InvisP t) = parens $ text "@" <+> ppr t
@@ -645,28 +646,20 @@
      <+> text "#-}"
     ppr (OpaqueP n)
        = text "{-# OPAQUE" <+> pprName' Applied n <+> text "#-}"
-    ppr (SpecialiseP n ty inline phases)
-       =   text "{-# SPECIALISE"
-       <+> maybe empty ppr inline
-       <+> ppr phases
-       <+> sep [ pprName' Applied n <+> dcolon
-               , nest 2 $ ppr ty ]
-       <+> text "#-}"
+    ppr (SpecialiseEP ty_bndrs tm_bndrs spec_e inline phases)
+       = sep [ text "{-# SPECIALISE"
+                 <+> maybe empty ppr inline
+                 <+> ppr phases
+             , nest 2 $ sep [ ppr_ty_forall ty_bndrs <+> ppr_tm_forall ty_bndrs tm_bndrs
+                            , nest 2 (ppr spec_e) ]
+                        <+> text "#-}" ]
     ppr (SpecialiseInstP inst)
        = text "{-# SPECIALISE instance" <+> ppr inst <+> text "#-}"
     ppr (RuleP n ty_bndrs tm_bndrs lhs rhs phases)
        = sep [ text "{-# RULES" <+> pprString n <+> ppr phases
-             , nest 4 $ ppr_ty_forall ty_bndrs <+> ppr_tm_forall ty_bndrs
+             , nest 4 $ ppr_ty_forall ty_bndrs <+> ppr_tm_forall ty_bndrs tm_bndrs
                                                <+> ppr lhs
              , nest 4 $ char '=' <+> ppr rhs <+> text "#-}" ]
-      where ppr_ty_forall Nothing      = empty
-            ppr_ty_forall (Just bndrs) = text "forall"
-                                         <+> fsep (map ppr bndrs)
-                                         <+> char '.'
-            ppr_tm_forall Nothing | null tm_bndrs = empty
-            ppr_tm_forall _ = text "forall"
-                              <+> fsep (map ppr tm_bndrs)
-                              <+> char '.'
     ppr (AnnP tgt expr)
        = text "{-# ANN" <+> target1 tgt <+> ppr expr <+> text "#-}"
       where target1 ModuleAnnotation    = text "module"
@@ -680,6 +673,17 @@
     ppr (SCCP nm str)
        = text "{-# SCC" <+> pprName' Applied nm <+> maybe empty pprString str <+> text "#-}"
 
+ppr_ty_forall :: Maybe [TyVarBndr ()] -> Doc
+ppr_ty_forall Nothing      = empty
+ppr_ty_forall (Just bndrs) = text "forall"
+                             <+> fsep (map ppr bndrs)
+                             <+> char '.'
+
+ppr_tm_forall :: Maybe [TyVarBndr ()] -> [RuleBndr] -> Doc
+ppr_tm_forall Nothing []       = empty
+ppr_tm_forall _       tm_bndrs = text "forall"
+                                 <+> fsep (map ppr tm_bndrs)
+                                 <+> char '.'
 ------------------------------
 instance Ppr Inline where
     ppr NoInline  = text "NOINLINE"
@@ -708,31 +712,27 @@
 
 ------------------------------
 instance Ppr Con where
-    ppr (NormalC c sts) = pprName' Applied c <+> sep (map pprBangType sts)
-
-    ppr (RecC c vsts)
-        = pprName' Applied c <+> braces (sep (punctuate comma $ map pprVarBangType vsts))
-
-    ppr (InfixC st1 c st2) = pprBangType st1
-                         <+> pprName' Infix c
-                         <+> pprBangType st2
-
-    ppr (ForallC ns ctxt (GadtC cs sts ty))
-        = commaSepApplied cs <+> dcolon <+> pprForall ns ctxt
-      <+> pprGadtRHS sts ty
-
-    ppr (ForallC ns ctxt (RecGadtC cs vsts ty))
-        = commaSepApplied cs <+> dcolon <+> pprForall ns ctxt
-      <+> pprRecFields vsts ty
-
-    ppr (ForallC ns ctxt con)
-        = pprForall ns ctxt <+> ppr con
-
-    ppr (GadtC cs sts ty)
-        = commaSepApplied cs <+> dcolon <+> pprGadtRHS sts ty
-
-    ppr (RecGadtC cs vsts ty)
-        = commaSepApplied cs <+> dcolon <+> pprRecFields vsts ty
+  ppr = ppr_con id
+    where
+      ppr_con :: (Doc -> Doc) -> Con -> Doc
+      ppr_con ppr_foralls (NormalC c sts) =
+        ppr_foralls $ pprName' Applied c <+> sep (map pprBangType sts)
+      ppr_con ppr_foralls (RecC c vsts) =
+        ppr_foralls $ pprName' Applied c <+> ppr_rec vsts
+        where
+          ppr_rec :: [VarBangType] -> Doc
+          ppr_rec = braces . sep . punctuate comma . map pprVarBangType
+      ppr_con ppr_foralls (InfixC st1 c st2) =
+        ppr_foralls $
+              pprBangType st1
+          <+> pprName' Infix c
+          <+> pprBangType st2
+      ppr_con ppr_foralls (ForallC ns ctxt con)
+        = ppr_con (\d -> ppr_foralls $ sep [pprForall ns ctxt, d]) con
+      ppr_con ppr_foralls (GadtC cs sts ty)
+        = commaSepApplied cs <+> dcolon <+> ppr_foralls (pprGadtRHS sts ty)
+      ppr_con ppr_foralls (RecGadtC cs vsts ty)
+        = commaSepApplied cs <+> dcolon <+> ppr_foralls (pprRecFields vsts ty)
 
 instance Ppr PatSynDir where
   ppr Unidir        = text "<-"
diff --git a/ghc-boot-th.cabal b/ghc-boot-th.cabal
--- a/ghc-boot-th.cabal
+++ b/ghc-boot-th.cabal
@@ -3,7 +3,7 @@
 -- ghc-boot-th.cabal.in, not ghc-boot-th.cabal.
 
 name:           ghc-boot-th
-version:        9.12.4
+version:        9.14.1
 license:        BSD3
 license-file:   LICENSE
 category:       GHC
@@ -29,7 +29,7 @@
 Flag bootstrap
         Description:
           Enabled when building the stage1 compiler in order to vendor the in-tree
-          `ghc-boot-th` library, and through that the in-tree TH AST defintions from
+          `ghc-boot-th` library, and through that the in-tree TH AST definitions from
           `ghc-internal`.
           See Note [Bootstrapping Template Haskell]
         Default: False
@@ -49,12 +49,13 @@
             GHC.Lexeme
 
     build-depends:
-        base       >= 4.7 && < 4.22,
-        ghc-prim,
-        pretty      == 1.1.*
+        base       >= 4.7 && < 4.23,
+        pretty     == 1.1.*
 
     if flag(bootstrap)
         cpp-options: -DBOOTSTRAP_TH
+        build-depends:
+            ghc-prim
         hs-source-dirs: . 
         exposed-modules:
             GHC.Boot.TH.Lib
