 +      6 -> ListPat <$> get bh <*> get bh <*> get bh
 +      7 -> TuplePat <$> get bh <*> get bh <*> get bh
 +      8 -> SumPat <$> get bh <*> get bh <*> get bh <*> get bh
-+      10 -> ConPatIn <$> get bh <*> get bh
-+      -- we don't support ConPatOut
-+      12 -> ViewPat <$> get bh <*> get bh <*> get bh
-+      -- we don't support SplicePat
-+      14 -> LitPat <$> get bh
-+      15 -> NPat <$> get bh <*> get bh <*> get bh <*> get bh
-+      16 -> NPlusKPat <$> get bh <*> get bh <*> get bh <*> get bh
++      9 -> ConPatIn <$> get bh <*> get bh
++      10 -> ViewPat <$> get bh <*> get bh <*> get bh
++      11 -> LitPat <$> get bh
++      12 -> NPat <$> get bh <*> get bh <*> get bh <*> get bh
++      13 -> NPlusKPat <$> get bh <*> get bh <*> get bh <*> get bh
 +                      <*> get bh <*> get bh
-+      17 -> SigPatIn <$> get bh <*> get bh
-+      -- we don't support CoPat
-+      _ -> panic "Binary (HsPat GhcSe).get: unknown tag"
++      14 -> SigPatIn <$> get bh <*> get bh
++      15 -> SplicePat <$> get bh
++      _ -> getPanic "HsPat"
 +
 +instance (Binary (FieldOcc a), Binary b) => Binary (HsRecFields a b) where
 +  put_ bh (HsRecFields a b) = put_ bh a >> put_ bh b

+    case tag of
+      0 -> ApplicativeArgOne <$> get bh <*> get bh <*> get bh
+      1 -> ApplicativeArgMany <$> get bh <*> get bh <*> get bh
+      _ -> panic "Binary ApplicativeAr.get: unknown tag"
+
+instance Binary (ParStmtBlock GhcSe GhcSe) where
+  put_ bh b = case b of
+    ParStmtBlock a b c ->
+      putByte bh 0 >> put_ bh a >> put_ bh b >> put_ bh c
+  get bh = do
+    tag <- getByte bh
+    case tag of
+      0 -> ParStmtBlock <$> get bh <*> get bh <*> get bh
+      _ -> panic "Binary ParStmtBlock.get: unknown tag"
+
+instance Binary (SyntaxExpr GhcSe) where
+  put_ bh (SyntaxExpr a [] WpHole) = put_ bh a
+  put_ _ _ = panic "Binary SyntaxExpr.put: wrappers should be empty"
+  get bh = SyntaxExpr <$> get bh <*> pure [] <*> pure WpHole
+
+instance Binary (GRHSs GhcSe (LHsExpr GhcSe)) where
+  put_ bh g = case g of
+    GRHSs a b -> putByte bh 0 >> put_ bh a >> put_ bh b
+  get bh = do
+    tag <- getByte bh
+    case tag of
+      0 -> GRHSs <$> get bh <*> get bh
+      _ -> panic "Binary GRHSs.get: unknown tag"
+
+instance Binary (GRHS GhcSe (LHsExpr GhcSe)) where
+  put_ bh g = case g of
+    GRHS a b -> putByte bh 0 >> put_ bh a >> put_ bh b
+  get bh = do
+    tag <- getByte bh
+    case tag of
+      0 -> GRHS <$> get bh <*> get bh
+      _ -> panic "Binary GRHS.get: unknown tag"
+
+instance Binary (MatchGroup GhcSe (LHsExpr GhcSe)) where
+  put_ bh g = case g of
+    MG a b c d -> putByte bh 0 >> put_ bh a >> put_ bh b >> put_ bh c >> put_ bh d
+  get bh = do
+    tag <- getByte bh
+    case tag of
+      0 -> MG <$> get bh <*> get bh <*> get bh <*> get bh
+      _ -> panic "Binary MatchGroup.get: unknown tag"
+
+instance Binary (Match GhcSe (LHsExpr GhcSe)) where
+  put_ bh m = case m of
+    Match a b c ->
+      putByte bh 0 >> put_ bh a >> put_ bh b >> put_ bh c
+  get bh = do
+    tag <- getByte bh
+    case tag of
+      0 -> Match <$> get bh <*> get bh <*> get bh
+      _ -> panic "Binary Match.get: unknown tag"
+
+
+instance Binary (HsMatchContext SeName) where
+  put_ bh c = case c of
+    FunRhs a b c ->
+      putByte bh 0 >> put_ bh a >> put_ bh b >> put_ bh c
+    LambdaExpr -> putByte bh 1
+    CaseAlt -> putByte bh 2
+    IfAlt -> putByte bh 3
+    ProcExpr -> putByte bh 4
+    PatBindRhs -> putByte bh 5
+    -- PatBindGuards -> putByte bh 6
+    RecUpd -> putByte bh 7
+    StmtCtxt a -> putByte bh 8 >> put_ bh a
+    ThPatSplice -> putByte bh 9
+    ThPatQuote -> putByte bh 10
+    PatSyn -> putByte bh 11
+  get bh = do
+    tag <- getByte bh
+    case tag of

+    <*> traverse cvFamilyResultSig e
+    <*> traverse (traverse cvInjectivityAnn) f
+
+cvAnnProvenance :: ConvertName a b => AnnProvenance a -> Conv (AnnProvenance b)
+cvAnnProvenance (ValueAnnProvenance a) = ValueAnnProvenance <$> convertName a
+cvAnnProvenance (TypeAnnProvenance a) = TypeAnnProvenance <$> convertName a
+cvAnnProvenance ModuleAnnProvenance = pure ModuleAnnProvenance
+
+cvInjectivityAnn
+  :: TypeConstraints p q => InjectivityAnn p -> Conv (InjectivityAnn q)
+cvInjectivityAnn (InjectivityAnn a b) =
+  InjectivityAnn <$> convertName a <*> convertName b
+
+cvFamilyResultSig
+  :: TypeConstraints p q => FamilyResultSig p -> Conv (FamilyResultSig q)
+cvFamilyResultSig NoSig = pure NoSig
+cvFamilyResultSig (KindSig a) = KindSig <$> traverse cvType a
+cvFamilyResultSig (TyVarSig a) = TyVarSig <$> traverse cvHsTyVarBndr a
+
+cvFamilyInfo :: TypeConstraints p q => FamilyInfo p -> Conv (FamilyInfo q)
+cvFamilyInfo DataFamily = pure DataFamily
+cvFamilyInfo OpenTypeFamily = pure OpenTypeFamily
+cvFamilyInfo (ClosedTypeFamily a) =
