diff --git a/compiler/GHC/Hs/Dump.hs b/compiler/GHC/Hs/Dump.hs
index 5ac4cb688ab1973cb165f47a86ab60bdd37866f3..15ed78211af48ad0ccba917559a9a547f43c3661 100644
--- a/compiler/GHC/Hs/Dump.hs
+++ b/compiler/GHC/Hs/Dump.hs
@@ -73,7 +73,6 @@ showAstData bs ba a0 = blankLine $$ showAstData' a0
               `extQ` annotationNoEpAnns
               `extQ` annotationExprBracket
               `extQ` annotationTypedBracket
-              `extQ` addEpAnn
               `extQ` epTokenOC
               `extQ` epTokenCC
               `extQ` epTokenInstance
@@ -216,11 +215,13 @@ showAstData bs ba a0 = blankLine $$ showAstData' a0
              BlankSrcSpanFile -> braces $ char ' ' <> (pprUserRealSpan False ss) <> char ' '
 
             annParen :: AnnParen -> SDoc
-            annParen (AnnParen a o c) = case ba of
+            annParen ap = case ba of
              BlankEpAnnotations -> parens $ text "blanked:" <+> text "AnnParen"
-             NoBlankEpAnnotations ->
-              parens $ text "AnnParen"
-                        $$ vcat [ppr a, epaLocation o, epaLocation c]
+             NoBlankEpAnnotations -> parens (case ap of
+                                      (AnnParens       o c) -> text "AnnParens"       $$ vcat [showAstData' o, showAstData' c]
+                                      (AnnParensHash   o c) -> text "AnnParensHash"   $$ vcat [showAstData' o, showAstData' c]
+                                      (AnnParensSquare o c) -> text "AnnParensSquare" $$ vcat [showAstData' o, showAstData' c]
+                                      )
 
             annClassDecl :: AnnClassDecl -> SDoc
             annClassDecl (AnnClassDecl c ops cps v w oc cc s) = case ba of
@@ -268,13 +269,6 @@ showAstData bs ba a0 = blankLine $$ showAstData' a0
                                  showAstData' d, showAstData' e]
 
 
-            addEpAnn :: AddEpAnn -> SDoc
-            addEpAnn (AddEpAnn a s) = case ba of
-             BlankEpAnnotations -> parens
-                                      $ text "blanked:" <+> text "AddEpAnn"
-             NoBlankEpAnnotations ->
-              parens $ text "AddEpAnn" <+> ppr a <+> epaLocation s
-
             annotationExprBracket :: BracketAnn (EpUniToken "[|" "⟦") (EpToken "[e|") -> SDoc
             annotationExprBracket = annotationBracket
 
diff --git a/compiler/GHC/Hs/Expr.hs b/compiler/GHC/Hs/Expr.hs
index 11d7a47e415b163865ab835103a335cb2479afe4..2b3fc36377480b70f9bd9134ec32f8a6e997e41a 100644
--- a/compiler/GHC/Hs/Expr.hs
+++ b/compiler/GHC/Hs/Expr.hs
@@ -1600,8 +1600,8 @@ type instance XXGRHSs (GhcPass _) _ = DataConCantHappen
 
 data GrhsAnn
   = GrhsAnn {
-      ga_vbar :: Maybe EpaLocation, -- TODO:AZ do we need this?
-      ga_sep  :: AddEpAnn -- ^ Match separator location
+      ga_vbar :: Maybe (EpToken "|"),
+      ga_sep  :: Either (EpToken "=") TokRarrow -- ^ Match separator location, `=` or `->`
       } deriving (Data)
 
 instance NoAnn GrhsAnn where
diff --git a/compiler/GHC/Parser.y b/compiler/GHC/Parser.y
index 858707505b4a0a3dd652d4c783015de7baa32023..5a046e0096a99df40bdb399e752d5fe601a73367 100644
--- a/compiler/GHC/Parser.y
+++ b/compiler/GHC/Parser.y
@@ -791,7 +791,7 @@ identifier :: { LocatedN RdrName }
         | qvarop                        { $1 }
         | qconop                        { $1 }
     | '->'              {% amsr (sLL $1 $> $ getRdrName unrestrictedFunTyCon)
-                                (NameAnnRArrow (isUnicode $1) Nothing (glR $1) Nothing []) }
+                                (NameAnnRArrow  Nothing (epUniTok $1) Nothing []) }
 
 -----------------------------------------------------------------------------
 -- Backpack stuff
@@ -1000,7 +1000,7 @@ header_top_importdecls :: { [LImportDecl GhcPs] }
 
 maybeexports :: { (Maybe (LocatedLI [LIE GhcPs])) }
         :  '(' exportlist ')'       {% fmap Just $ amsr (sLL $1 $> (fromOL $ snd $2))
-                                        (AnnList Nothing (Just $ mop $1) (Just $ mcp $3) [] (noAnn,fst $2) []) }
+                                        (AnnList Nothing (ListParens (epTok $1) (epTok $3)) [] (noAnn,fst $2) []) }
         |  {- empty -}              { Nothing }
 
 exportlist :: { ([EpToken ","], OrdList (LIE GhcPs)) }
@@ -1178,10 +1178,10 @@ maybeimpspec :: { Located (Maybe (ImportListInterpretation, LocatedLI [LIE GhcPs
 
 impspec :: { Located (ImportListInterpretation, LocatedLI [LIE GhcPs]) }
         :  '(' importlist ')'               {% do { es <- amsr (sLL $1 $> $ fromOL $ snd $2)
-                                                               (AnnList Nothing (Just $ mop $1) (Just $ mcp $3) [] (noAnn,fst $2) [])
+                                                               (AnnList Nothing (ListParens (epTok $1) (epTok $3)) [] (noAnn,fst $2) [])
                                                   ; return $ sLL $1 $> (Exactly, es)} }
         |  'hiding' '(' importlist ')'      {% do { es <- amsr (sLL $1 $> $ fromOL $ snd $3)
-                                                               (AnnList Nothing (Just $ mop $2) (Just $ mcp $4) [] (epTok $1,fst $3) [])
+                                                               (AnnList Nothing (ListParens (epTok $2) (epTok $4)) [] (epTok $1,fst $3) [])
                                                   ; return $ sLL $1 $> (EverythingBut, es)} }
 
 importlist :: { ([EpToken ","], OrdList (LIE GhcPs)) }
@@ -1736,9 +1736,9 @@ cvars1 :: { [RecordPatSynField GhcPs] }
 
 where_decls :: { LocatedLW (OrdList (LHsDecl GhcPs)) }
         : 'where' '{' decls '}'       {% amsr (sLL $1 $> (thdOf3 $ unLoc $3))
-                                              (AnnList (Just (fstOf3 $ unLoc $3)) (Just $ moc $2) (Just $ mcc $4) (sndOf3 $ unLoc $3) (epTok $1) []) }
+                                              (AnnList (Just (fstOf3 $ unLoc $3)) (ListBraces (epTok $2) (epTok $4)) (sndOf3 $ unLoc $3) (epTok $1) []) }
         | 'where' vocurly decls close {% amsr (sLL $1 $3 (thdOf3 $ unLoc $3))
-                                              (AnnList (Just (fstOf3 $ unLoc $3)) Nothing Nothing (sndOf3 $ unLoc $3) (epTok $1) []) }
+                                              (AnnList (Just (fstOf3 $ unLoc $3)) ListNone (sndOf3 $ unLoc $3) (epTok $1) []) }
 
 pattern_synonym_sig :: { LSig GhcPs }
         : 'pattern' con_list '::' sigtype
@@ -1874,9 +1874,9 @@ decls   :: { Located (EpaLocation, [EpToken ";"], OrdList (LHsDecl GhcPs)) }
         | {- empty -}                   { noLoc (noAnn, [],nilOL) }
 
 decllist :: { Located (AnnList (),Located (OrdList (LHsDecl GhcPs))) }
-        : '{'            decls '}'     { sLL $1 $> (AnnList (Just (fstOf3 $ unLoc $2)) (Just $ moc $1) (Just $ mcc $3)  (sndOf3 $ unLoc $2) noAnn []
+        : '{'            decls '}'     { sLL $1 $> (AnnList (Just (fstOf3 $ unLoc $2)) (ListBraces (epTok $1) (epTok $3)) (sndOf3 $ unLoc $2) noAnn []
                                                    ,sL1 $2 $ thdOf3 $ unLoc $2) }
-        |     vocurly    decls close   { L (getHasLoc $ fstOf3 $ unLoc $2) (AnnList (Just (glR $2)) Nothing Nothing (sndOf3 $ unLoc $2) noAnn []
+        |     vocurly    decls close   { L (getHasLoc $ fstOf3 $ unLoc $2) (AnnList (Just (glR $2)) ListNone (sndOf3 $ unLoc $2) noAnn []
                                                    ,sL1 $2 $ thdOf3 $ unLoc $2) }
 
 -- Binding groups other than those of class and instance declarations
@@ -1884,16 +1884,16 @@ decllist :: { Located (AnnList (),Located (OrdList (LHsDecl GhcPs))) }
 binds   ::  { Located (HsLocalBinds GhcPs) }
                                          -- May have implicit parameters
                                                 -- No type declarations
-        : decllist          {% do { let { (AnnList anc o c s _ t, decls) = unLoc $1 }
+        : decllist          {% do { let { (AnnList anc p s _ t, decls) = unLoc $1 }
                                   ; val_binds <- cvBindGroup (unLoc $ decls)
                                   ; !cs <- getCommentsFor (gl $1)
-                                  ; return (sL1 $1 $ HsValBinds (EpAnn (glR $1) (AnnList anc o c s noAnn t) cs) val_binds)} }
+                                  ; return (sL1 $1 $ HsValBinds (EpAnn (glR $1) (AnnList anc p s noAnn t) cs) val_binds)} }
 
         | '{'            dbinds '}'     {% acs (comb3 $1 $2 $3) (\loc cs -> (L loc
-                                             $ HsIPBinds (EpAnn (spanAsAnchor (comb3 $1 $2 $3)) (AnnList (Just$ glR $2) (Just $ moc $1) (Just $ mcc $3) [] noAnn []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
+                                             $ HsIPBinds (EpAnn (spanAsAnchor (comb3 $1 $2 $3)) (AnnList (Just$ glR $2) (ListBraces (epTok $1) (epTok $3)) [] noAnn []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
 
         |     vocurly    dbinds close   {% acs (gl $2) (\loc cs -> (L loc
-                                             $ HsIPBinds (EpAnn (glR $1) (AnnList (Just $ glR $2) Nothing Nothing [] noAnn []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
+                                             $ HsIPBinds (EpAnn (glR $1) (AnnList (Just $ glR $2) ListNone [] noAnn []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
 
 
 wherebinds :: { Maybe (Located (HsLocalBinds GhcPs, Maybe EpAnnComments )) }
@@ -2268,7 +2268,6 @@ type :: { LHsType GhcPs }
 
         | btype '->.' ctype            {% hintLinear (getLoc $2) >>
                                           amsA' (sLL $1 $> $ HsFunTy noExtField (HsLinearArrow (EpLolly (epTok $2))) $1 $3) }
-                                              -- [mu AnnLollyU $2] }
 
 mult :: { Located (EpUniToken "->" "\8594" -> HsArrow GhcPs) }
         : PREFIX_PERCENT atype          { sLL $1 $> (mkMultTy (epTok $1) $2) }
@@ -2307,10 +2306,10 @@ tyop :: { (LocatedN RdrName, PromotionFlag) }
         : qtyconop                      { ($1, NotPromoted) }
         | tyvarop                       { ($1, NotPromoted) }
         | SIMPLEQUOTE qconop            {% do { op <- amsr (sLL $1 $> (unLoc $2))
-                                                           (NameAnnQuote (glR $1) (gl $2) [])
+                                                           (NameAnnQuote (epTok $1) (gl $2) [])
                                               ; return (op, IsPromoted) } }
         | SIMPLEQUOTE varop             {% do { op <- amsr (sLL $1 $> (unLoc $2))
-                                                           (NameAnnQuote (glR $1) (gl $2) [])
+                                                           (NameAnnQuote (epTok $1) (gl $2) [])
                                               ; return (op, IsPromoted) } }
 
 atype :: { LHsType GhcPs }
@@ -2325,21 +2324,21 @@ atype :: { LHsType GhcPs }
         | PREFIX_TILDE atype             {% amsA' (sLL $1 $> (mkBangTy (glR $1) SrcLazy $2)) }
         | PREFIX_BANG  atype             {% amsA' (sLL $1 $> (mkBangTy (glR $1) SrcStrict $2)) }
 
-        | '{' fielddecls '}'             {% do { decls <- amsA' (sLL $1 $> $ HsRecTy (AnnList (listAsAnchorM $2) (Just $ moc $1) (Just $ mcc $3) [] noAnn []) $2)
+        | '{' fielddecls '}'             {% do { decls <- amsA' (sLL $1 $> $ HsRecTy (AnnList (listAsAnchorM $2) (ListBraces (epTok $1) (epTok $3)) [] noAnn []) $2)
                                                ; checkRecordSyntax decls }}
                                                         -- Constructor sigs only
 
         -- List and tuple syntax whose interpretation depends on the extension ListTuplePuns.
-        | '(' ')'                        {% amsA' . sLL $1 $> =<< (mkTupleSyntaxTy (glR $1) [] (glR $>)) }
+        | '(' ')'                        {% amsA' . sLL $1 $> =<< (mkTupleSyntaxTy (epTok $1) [] (epTok $>)) }
         | '(' ktype ',' comma_types1 ')' {% do { h <- addTrailingCommaA $2 (gl $3)
-                                               ; amsA' . sLL $1 $> =<< (mkTupleSyntaxTy (glR $1) (h : $4) (glR $>)) }}
+                                               ; amsA' . sLL $1 $> =<< (mkTupleSyntaxTy (epTok $1) (h : $4) (epTok $>)) }}
         | '(#' '#)'                   {% do { requireLTPuns PEP_TupleSyntaxType $1 $>
-                                            ; amsA' (sLL $1 $> $ HsTupleTy (AnnParen AnnParensHash (glR $1) (glR $2)) HsUnboxedTuple []) } }
+                                            ; amsA' (sLL $1 $> $ HsTupleTy (AnnParensHash (epTok $1) (epTok $2)) HsUnboxedTuple []) } }
         | '(#' comma_types1 '#)'      {% do { requireLTPuns PEP_TupleSyntaxType $1 $>
-                                            ; amsA' (sLL $1 $> $ HsTupleTy (AnnParen AnnParensHash (glR $1) (glR $3)) HsUnboxedTuple $2) } }
+                                            ; amsA' (sLL $1 $> $ HsTupleTy (AnnParensHash (epTok $1) (epTok $3)) HsUnboxedTuple $2) } }
         | '(#' bar_types2 '#)'        {% do { requireLTPuns PEP_SumSyntaxType $1 $>
-                                      ; amsA' (sLL $1 $> $ HsSumTy (AnnParen AnnParensHash (glR $1) (glR $3)) $2) } }
-        | '[' ktype ']'               {% amsA' . sLL $1 $> =<< (mkListSyntaxTy1 (glR $1) $2 (glR $3)) }
+                                      ; amsA' (sLL $1 $> $ HsSumTy (AnnParensHash (epTok $1) (epTok $3)) $2) } }
+        | '[' ktype ']'               {% amsA' . sLL $1 $> =<< (mkListSyntaxTy1 (epTok $1) $2 (epTok $3)) }
         | '(' ktype ')'               {% amsA' (sLL $1 $> $ HsParTy (epTok $1, epTok $3) $2) }
                                       -- see Note [Promotion] for the followings
         | SIMPLEQUOTE '(' ')'         {% do { requireLTPuns PEP_QuoteDisambiguation $1 $>
@@ -2351,7 +2350,7 @@ atype :: { LHsType GhcPs }
                              {% do { requireLTPuns PEP_QuoteDisambiguation $1 $>
                                    ; h <- addTrailingCommaA $3 (gl $4)
                                    ; amsA' (sLL $1 $> $ HsExplicitTupleTy (epTok $1,epTok $2,epTok $6) (h : $5)) }}
-        | '[' ']'               {% withCombinedComments $1 $> (mkListSyntaxTy0 (glR $1) (glR $2)) }
+        | '[' ']'               {% withCombinedComments $1 $> (mkListSyntaxTy0 (epTok $1) (epTok $2)) }
         | SIMPLEQUOTE  '[' comma_types0 ']'     {% do { requireLTPuns PEP_QuoteDisambiguation $1 $>
                                                       ; amsA' (sLL $1 $> $ HsExplicitListTy (epTok $1, epTok $2, epTok $4) IsPromoted $3) }}
         | SIMPLEQUOTE var                       {% amsA' (sLL $1 $> $ HsTyVar (epTok $1) IsPromoted $2) }
@@ -2630,9 +2629,9 @@ deriv_clause_types :: { LDerivClauseTys GhcPs }
                                            sL1a $1 $ HsTyVar noAnn NotPromoted $1 } in
                                 sL1a $1 (DctSingle noExtField tc) }
         | '(' ')'             {% amsr (sLL $1 $> (DctMulti noExtField []))
-                                      (AnnContext Nothing [glR $1] [glR $2]) }
+                                      (AnnContext Nothing [epTok $1] [epTok $2]) }
         | '(' deriv_types ')' {% amsr (sLL $1 $> (DctMulti noExtField $2))
-                                      (AnnContext Nothing [glR $1] [glR $3])}
+                                      (AnnContext Nothing [epTok $1] [epTok $3])}
 
 -----------------------------------------------------------------------------
 -- Value definitions
@@ -2697,7 +2696,7 @@ rhs     :: { Located (GRHSs GhcPs (LHsExpr GhcPs)) }
                                      ; let loc = (comb3 $1 $2 (L l bs))
                                      ; let locg = (comb2 $1 $2)
                                      ; acs loc (\loc cs ->
-                                       sL loc (GRHSs csw (unguardedRHS (EpAnn (spanAsAnchor locg) (GrhsAnn Nothing (mj AnnEqual $1)) cs) locg $2)
+                                       sL loc (GRHSs csw (unguardedRHS (EpAnn (spanAsAnchor locg) (GrhsAnn Nothing (Left $ epTok $1)) cs) locg $2)
                                                       bs)) } }
         | gdrhs wherebinds      {% do { let {L l (bs, csw) = adaptWhereBinds $2}
                                       ; acs (comb2 $1 (L l bs)) (\loc cs -> L loc
@@ -2709,7 +2708,7 @@ gdrhs :: { Located [LGRHS GhcPs (LHsExpr GhcPs)] }
 
 gdrh :: { LGRHS GhcPs (LHsExpr GhcPs) }
         : '|' guardquals '=' exp  {% runPV (unECP $4) >>= \ $4 ->
-                                     acsA (comb2 $1 $>) (\loc cs -> L loc $ GRHS (EpAnn (glEE $1 $>) (GrhsAnn (Just $ glR $1) (mj AnnEqual $3)) cs) (unLoc $2) $4) }
+                                     acsA (comb2 $1 $>) (\loc cs -> L loc $ GRHS (EpAnn (glEE $1 $>) (GrhsAnn (Just $ epTok $1) (Left $ epTok $3)) cs) (unLoc $2) $4) }
 
 sigdecl :: { LHsDecl GhcPs }
         :
@@ -3025,7 +3024,7 @@ aexp    :: { ECP }
                                          $ Match { m_ext = noExtField
                                                  , m_ctxt = LamAlt LamSingle
                                                  , m_pats = L (listLocation $2) $2
-                                                 , m_grhss = unguardedGRHSs (comb2 $3 $4) $4 (EpAnn (glR $3) (GrhsAnn Nothing (mu AnnRarrow $3)) emptyComments) }])
+                                                 , m_grhss = unguardedGRHSs (comb2 $3 $4) $4 (EpAnn (glR $3) (GrhsAnn Nothing (Right $ epUniTok $3)) emptyComments) }])
                             (EpAnnLam (glR $1) Nothing) }
         | '\\' 'lcase' altslist(pats1)
             {  ECP $ $3 >>= \ $3 ->
@@ -3149,7 +3148,7 @@ aexp2   :: { ECP }
                                            mkSumOrTuplePV (noAnnSrcSpan $ comb2 $1 $>) Unboxed $2
                                                 (glR $1,glR $3) }
 
-        | '[' list ']'      { ECP $ $2 (comb2 $1 $>) (mos $1,mcs $3) }
+        | '[' list ']'      { ECP $ $2 (comb2 $1 $>) (glR $1,glR $3) }
         | '_'               { ECP $ mkHsWildCardPV (getLoc $1) }
 
         -- Template Haskell Extension
@@ -3181,7 +3180,7 @@ aexp2   :: { ECP }
         -- arrow notation extension
         | '(|' aexp cmdargs '|)'  {% runPV (unECP $2) >>= \ $2 ->
                                       fmap ecpFromCmd $
-                                      amsA' (sLL $1 $> $ HsCmdArrForm (AnnList (glRM $1) (Just $ mu AnnOpenB $1) (Just $ mu AnnCloseB $4) [] noAnn []) $2 Prefix
+                                      amsA' (sLL $1 $> $ HsCmdArrForm (AnnList (glRM $1) (ListBanana (epUniTok $1) (epUniTok $4)) [] noAnn []) $2 Prefix
                                                            (reverse $3)) }
 
 projection :: { Located (NonEmpty (LocatedAn NoEpAnns (DotFieldOcc GhcPs))) }
@@ -3313,35 +3312,35 @@ tup_tail :: { forall b. DisambECP b => PV [Either (EpAnn Bool) (LocatedA b)] }
 -- The rules below are little bit contorted to keep lexps left-recursive while
 -- avoiding another shift/reduce-conflict.
 -- Never empty.
-list :: { forall b. DisambECP b => SrcSpan -> (AddEpAnn, AddEpAnn) -> PV (LocatedA b) }
+list :: { forall b. DisambECP b => SrcSpan -> (EpaLocation, EpaLocation) -> PV (LocatedA b) }
         : texp    { \loc (ao,ac) -> unECP $1 >>= \ $1 ->
-                            mkHsExplicitListPV loc [$1] (AnnList Nothing (Just ao) (Just ac) [] noAnn []) }
+                            mkHsExplicitListPV loc [$1] (AnnList Nothing (ListSquare (EpTok ao) (EpTok ac)) [] noAnn []) }
         | lexps   { \loc (ao,ac) -> $1 >>= \ $1 ->
-                            mkHsExplicitListPV loc (reverse $1) (AnnList Nothing (Just ao) (Just ac) [] noAnn []) }
+                            mkHsExplicitListPV loc (reverse $1) (AnnList Nothing (ListSquare (EpTok ao) (EpTok ac)) [] noAnn []) }
         | texp '..'  { \loc (ao,ac) -> unECP $1 >>= \ $1 ->
-                                  amsA' (L loc $ ArithSeq  (AnnArithSeq (EpTok (addEpAnnLoc ao)) Nothing (epTok $2) (EpTok (addEpAnnLoc ac))) Nothing (From $1))
+                                  amsA' (L loc $ ArithSeq  (AnnArithSeq (EpTok ao) Nothing (epTok $2) (EpTok ac)) Nothing (From $1))
                                       >>= ecpFromExp' }
         | texp ',' exp2 '..' { \loc (ao,ac) ->
                                    unECP $1 >>= \ $1 ->
                                    unECP $3 >>= \ $3 ->
-                                   amsA' (L loc $ ArithSeq (AnnArithSeq (EpTok (addEpAnnLoc ao)) (Just (epTok $2)) (epTok $4) (EpTok (addEpAnnLoc ac))) Nothing (FromThen $1 $3))
+                                   amsA' (L loc $ ArithSeq (AnnArithSeq (EpTok ao) (Just (epTok $2)) (epTok $4) (EpTok ac)) Nothing (FromThen $1 $3))
                                        >>= ecpFromExp' }
         | texp '..' exp2  { \loc (ao,ac) ->
                                    unECP $1 >>= \ $1 ->
                                    unECP $3 >>= \ $3 ->
-                                   amsA' (L loc $ ArithSeq (AnnArithSeq (EpTok (addEpAnnLoc ao)) Nothing (epTok $2) (EpTok (addEpAnnLoc ac))) Nothing (FromTo $1 $3))
+                                   amsA' (L loc $ ArithSeq (AnnArithSeq (EpTok ao) Nothing (epTok $2) (EpTok ac)) Nothing (FromTo $1 $3))
                                        >>= ecpFromExp' }
         | texp ',' exp2 '..' exp2 { \loc (ao,ac) ->
                                    unECP $1 >>= \ $1 ->
                                    unECP $3 >>= \ $3 ->
                                    unECP $5 >>= \ $5 ->
-                                   amsA' (L loc $ ArithSeq (AnnArithSeq (EpTok (addEpAnnLoc ao)) (Just (epTok $2)) (epTok $4) (EpTok (addEpAnnLoc ac))) Nothing (FromThenTo $1 $3 $5))
+                                   amsA' (L loc $ ArithSeq (AnnArithSeq (EpTok ao) (Just (epTok $2)) (epTok $4) (EpTok ac)) Nothing (FromThenTo $1 $3 $5))
                                        >>= ecpFromExp' }
         | texp '|' flattenedpquals
              { \loc (ao,ac) ->
                 checkMonadComp >>= \ ctxt ->
                 unECP $1 >>= \ $1 -> do { t <- addTrailingVbarA $1 (gl $2)
-                ; amsA' (L loc $ mkHsCompAnns ctxt (unLoc $3) t (AnnList Nothing (Just ao) (Just ac) [] noAnn []))
+                ; amsA' (L loc $ mkHsCompAnns ctxt (unLoc $3) t (AnnList Nothing (ListSquare (EpTok ao) (EpTok ac)) [] noAnn []))
                     >>= ecpFromExp' } }
 
 lexps :: { forall b. DisambECP b => PV [LocatedA b] }
@@ -3447,11 +3446,11 @@ guardquals1 :: { Located [LStmt GhcPs (LHsExpr GhcPs)] }
 altslist(PATS) :: { forall b. DisambECP b => PV (LocatedLW [LMatch GhcPs (LocatedA b)]) }
         : '{'        alts(PATS) '}'    { $2 >>= \ $2 -> amsr
                                            (sLL $1 $> (reverse (snd $ unLoc $2)))
-                                           (AnnList (Just $ glR $2) (Just $ moc $1) (Just $ mcc $3) (fst $ unLoc $2) noAnn []) }
+                                           (AnnList (Just $ glR $2) (ListBraces (epTok $1) (epTok $3)) (fst $ unLoc $2) noAnn []) }
         | vocurly    alts(PATS)  close { $2 >>= \ $2 -> amsr
                                            (L (getLoc $2) (reverse (snd $ unLoc $2)))
-                                           (AnnList (Just $ glR $2) Nothing Nothing (fst $ unLoc $2) noAnn []) }
-        | '{'              '}'   { amsr (sLL $1 $> []) (AnnList Nothing (Just $ moc $1) (Just $ mcc $2) [] noAnn []) }
+                                           (AnnList (Just $ glR $2) ListNone (fst $ unLoc $2) noAnn []) }
+        | '{'              '}'   { amsr (sLL $1 $> []) (AnnList Nothing (ListBraces (epTok $1) (epTok $2)) [] noAnn []) }
         | vocurly          close { return $ noLocA [] }
 
 alts(PATS) :: { forall b. DisambECP b => PV (Located ([EpToken ";"],[LMatch GhcPs (LocatedA b)])) }
@@ -3494,7 +3493,7 @@ alt_rhs :: { forall b. DisambECP b => PV (Located (GRHSs GhcPs (LocatedA b))) }
 
 ralt :: { forall b. DisambECP b => PV (Located [LGRHS GhcPs (LocatedA b)]) }
         : '->' exp            { unECP $2 >>= \ $2 ->
-                                acs (comb2 $1 $>) (\loc cs -> L loc (unguardedRHS (EpAnn (spanAsAnchor $ comb2 $1 $2) (GrhsAnn Nothing (mu AnnRarrow $1)) cs) (comb2 $1 $2) $2)) }
+                                acs (comb2 $1 $>) (\loc cs -> L loc (unguardedRHS (EpAnn (spanAsAnchor $ comb2 $1 $2) (GrhsAnn Nothing (Right $ epUniTok $1)) cs) (comb2 $1 $2) $2)) }
         | gdpats              { $1 >>= \gdpats ->
                                 return $ sL1 gdpats (reverse (unLoc gdpats)) }
 
@@ -3516,7 +3515,7 @@ ifgdpats :: { Located ((EpToken "{", EpToken "}"), [LGRHS GhcPs (LHsExpr GhcPs)]
 gdpat   :: { forall b. DisambECP b => PV (LGRHS GhcPs (LocatedA b)) }
         : '|' guardquals '->' exp
                                    { unECP $4 >>= \ $4 ->
-                                     acsA (comb2 $1 $>) (\loc cs -> sL loc $ GRHS (EpAnn (glEE $1 $>) (GrhsAnn (Just $ glR $1) (mu AnnRarrow $3)) cs) (unLoc $2) $4) }
+                                     acsA (comb2 $1 $>) (\loc cs -> sL loc $ GRHS (EpAnn (glEE $1 $>) (GrhsAnn (Just $ epTok $1) (Right $ epUniTok $3)) cs) (unLoc $2) $4) }
 
 -- 'pat' recognises a pattern, including one with a bang at the top
 --      e.g.  "!x" or "!(x,y)" or "C a b" etc
@@ -3561,9 +3560,9 @@ apat    : aexp                  {% (checkPattern <=< runPV) (unECP $1) }
 
 stmtlist :: { forall b. DisambECP b => PV (LocatedLW [LocatedA (Stmt GhcPs (LocatedA b))]) }
         : '{'           stmts '}'       { $2 >>= \ $2 ->
-                                          amsr (sLL $1 $> (reverse $ snd $ unLoc $2)) (AnnList (stmtsAnchor $2) (Just $ moc $1) (Just $ mcc $3) (fromOL $ fst $ unLoc $2) noAnn []) }
+                                          amsr (sLL $1 $> (reverse $ snd $ unLoc $2)) (AnnList (stmtsAnchor $2) (ListBraces (epTok $1) (epTok $3)) (fromOL $ fst $ unLoc $2) noAnn []) }
         |     vocurly   stmts close     { $2 >>= \ $2 -> amsr
-                                          (L (stmtsLoc $2) (reverse $ snd $ unLoc $2)) (AnnList (stmtsAnchor $2) Nothing Nothing (fromOL $ fst $ unLoc $2) noAnn []) }
+                                          (L (stmtsLoc $2) (reverse $ snd $ unLoc $2)) (AnnList (stmtsAnchor $2) ListNone (fromOL $ fst $ unLoc $2) noAnn []) }
 
 --      do { ;; s ; s ; ; s ;; }
 -- The last Stmt should be an expression, but that's hard to enforce
@@ -3735,7 +3734,7 @@ name_boolformula_and_list :: { [LBooleanFormula (LocatedN RdrName)] }
 
 name_boolformula_atom :: { LBooleanFormula (LocatedN RdrName) }
         : '(' name_boolformula ')'  {% amsr (sLL $1 $> (Parens $2))
-                                      (AnnList Nothing (Just (mop $1)) (Just (mcp $3)) [] noAnn []) }
+                                      (AnnList Nothing (ListParens (epTok $1) (epTok $3)) [] noAnn []) }
         | name_var                  { sL1a $1 (Var $1) }
 
 namelist :: { Located [LocatedN RdrName] }
@@ -3759,12 +3758,12 @@ qcon :: { LocatedN RdrName }
 gen_qcon :: { LocatedN RdrName }
   : qconid                { $1 }
   | '(' qconsym ')'       {% amsr (sLL $1 $> (unLoc $2))
-                                  (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                  (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
 
 con     :: { LocatedN RdrName }
         : conid                 { $1 }
         | '(' consym ')'        {% amsr (sLL $1 $> (unLoc $2))
-                                        (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                        (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
         | syscon                { $1 }
 
 con_list :: { Located (NonEmpty (LocatedN RdrName)) }
@@ -3779,31 +3778,31 @@ qcon_list : qcon                  { [$1] }
 -- See Note [ExplicitTuple] in GHC.Hs.Expr
 sysdcon_nolist :: { LocatedN DataCon }  -- Wired in data constructors
         : '(' commas ')'        {% amsr (sLL $1 $> $ tupleDataCon Boxed (snd $2 + 1))
-                                       (NameAnnCommas NameParens (glR $1) (map srcSpan2e (fst $2)) (glR $3) []) }
-        | '(#' '#)'             {% amsr (sLL $1 $> $ unboxedUnitDataCon) (NameAnnOnly NameParensHash (glR $1) (glR $2) []) }
+                                       (NameAnnCommas (NameParens (epTok $1) (epTok $3)) (map srcSpan2e (fst $2)) []) }
+        | '(#' '#)'             {% amsr (sLL $1 $> $ unboxedUnitDataCon) (NameAnnOnly (NameParensHash (epTok $1) (epTok $2)) []) }
         | '(#' commas '#)'      {% amsr (sLL $1 $> $ tupleDataCon Unboxed (snd $2 + 1))
-                                       (NameAnnCommas NameParensHash (glR $1) (map srcSpan2e (fst $2)) (glR $3) []) }
+                                       (NameAnnCommas (NameParensHash (epTok $1) (epTok $3)) (map srcSpan2e (fst $2)) []) }
 
 syscon :: { LocatedN RdrName }
         : sysdcon               {  L (getLoc $1) $ nameRdrName (dataConName (unLoc $1)) }
         | '(' '->' ')'          {% amsr (sLL $1 $> $ getRdrName unrestrictedFunTyCon)
-                                        (NameAnnRArrow (isUnicode $2) (Just $ glR $1) (glR $2) (Just $ glR $3) []) }
+                                        (NameAnnRArrow  (Just $ epTok $1) (epUniTok $2) (Just $ epTok $3) []) }
 
 -- See Note [Empty lists] in GHC.Hs.Expr
 sysdcon :: { LocatedN DataCon }
         : sysdcon_nolist                 { $1 }
-        | '(' ')'               {% amsr (sLL $1 $> unitDataCon) (NameAnnOnly NameParens (glR $1) (glR $2) []) }
-        | '[' ']'               {% amsr (sLL $1 $> nilDataCon)  (NameAnnOnly NameSquare (glR $1) (glR $2) []) }
+        | '(' ')'               {% amsr (sLL $1 $> unitDataCon) (NameAnnOnly (NameParens (epTok $1) (epTok $2)) []) }
+        | '[' ']'               {% amsr (sLL $1 $> nilDataCon)  (NameAnnOnly (NameSquare (epTok $1) (epTok $2)) []) }
 
 conop :: { LocatedN RdrName }
         : consym                { $1 }
         | '`' conid '`'         {% amsr (sLL $1 $> (unLoc $2))
-                                          (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                          (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 qconop :: { LocatedN RdrName }
         : qconsym               { $1 }
         | '`' qconid '`'        {% amsr (sLL $1 $> (unLoc $2))
-                                          (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                          (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 ----------------------------------------------------------------------------
 -- Type constructors
@@ -3814,29 +3813,29 @@ qconop :: { LocatedN RdrName }
 gtycon :: { LocatedN RdrName }  -- A "general" qualified tycon, including unit tuples
         : ntgtycon                     { $1 }
         | '(' ')'                      {% amsr (sLL $1 $> $ getRdrName unitTyCon)
-                                                (NameAnnOnly NameParens (glR $1) (glR $2) []) }
+                                                (NameAnnOnly (NameParens (epTok $1) (epTok $2)) []) }
         | '(#' '#)'                    {% amsr (sLL $1 $> $ getRdrName unboxedUnitTyCon)
-                                                (NameAnnOnly NameParensHash (glR $1) (glR $2) []) }
+                                                (NameAnnOnly (NameParensHash (epTok $1) (epTok $2)) []) }
         | '[' ']'               {% amsr (sLL $1 $> $ listTyCon_RDR)
-                                      (NameAnnOnly NameSquare (glR $1) (glR $2) []) }
+                                      (NameAnnOnly (NameSquare (epTok $1) (epTok $2)) []) }
 
 ntgtycon :: { LocatedN RdrName }  -- A "general" qualified tycon, excluding unit tuples
         : oqtycon               { $1 }
         | '(' commas ')'        {% do { n <- mkTupleSyntaxTycon Boxed (snd $2 + 1)
-                                      ; amsr (sLL $1 $> n) (NameAnnCommas NameParens (glR $1) (map srcSpan2e (fst $2)) (glR $3) []) }}
+                                      ; amsr (sLL $1 $> n) (NameAnnCommas (NameParens (epTok $1) (epTok $3)) (map srcSpan2e (fst $2)) []) }}
         | '(#' commas '#)'      {% do { n <- mkTupleSyntaxTycon Unboxed (snd $2 + 1)
-                                      ; amsr (sLL $1 $> n) (NameAnnCommas NameParensHash (glR $1) (map srcSpan2e (fst $2)) (glR $3) []) }}
+                                      ; amsr (sLL $1 $> n) (NameAnnCommas (NameParensHash (epTok $1) (epTok $3)) (map srcSpan2e (fst $2)) []) }}
         | '(#' bars '#)'        {% do { requireLTPuns PEP_SumSyntaxType $1 $>
                                       ; amsr (sLL $1 $> $ (getRdrName (sumTyCon (snd $2 + 1))))
-                                       (NameAnnBars NameParensHash (glR $1) (map srcSpan2e (fst $2)) (glR $3) []) } }
+                                       (NameAnnBars (epTok $1, epTok $3) (map srcSpan2e (fst $2)) []) } }
         | '(' '->' ')'          {% amsr (sLL $1 $> $ getRdrName unrestrictedFunTyCon)
-                                       (NameAnnRArrow (isUnicode $2) (Just $ glR $1) (glR $2) (Just $ glR $3) []) }
+                                       (NameAnnRArrow  (Just $ epTok $1) (epUniTok $2) (Just $ epTok $3) []) }
 
 oqtycon :: { LocatedN RdrName }  -- An "ordinary" qualified tycon;
                                 -- These can appear in export lists
         : qtycon                        { $1 }
         | '(' qtyconsym ')'             {% amsr (sLL $1 $> (unLoc $2))
-                                                  (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                                  (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
 
 oqtycon_no_varcon :: { LocatedN RdrName }  -- Type constructor which cannot be mistaken
                                           -- for variable constructor in export lists
@@ -3844,13 +3843,13 @@ oqtycon_no_varcon :: { LocatedN RdrName }  -- Type constructor which cannot be m
         :  qtycon            { $1 }
         | '(' QCONSYM ')'    {% let { name :: Located RdrName
                                     ; name = sL1 $2 $! mkQual tcClsName (getQCONSYM $2) }
-                                in amsr (sLL $1 $> (unLoc name)) (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                in amsr (sLL $1 $> (unLoc name)) (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
         | '(' CONSYM ')'     {% let { name :: Located RdrName
                                     ; name = sL1 $2 $! mkUnqual tcClsName (getCONSYM $2) }
-                                in amsr (sLL $1 $> (unLoc name)) (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                in amsr (sLL $1 $> (unLoc name)) (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
         | '(' ':' ')'        {% let { name :: Located RdrName
                                     ; name = sL1 $2 $! consDataCon_RDR }
-                                in amsr (sLL $1 $> (unLoc name)) (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                in amsr (sLL $1 $> (unLoc name)) (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
 
 {- Note [Type constructors in export list]
 ~~~~~~~~~~~~~~~~~~~~~
@@ -3876,7 +3875,7 @@ qtyconop :: { LocatedN RdrName } -- Qualified or unqualified
         -- See Note [%shift: qtyconop -> qtyconsym]
         : qtyconsym %shift              { $1 }
         | '`' qtycon '`'                {% amsr (sLL $1 $> (unLoc $2))
-                                                (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                                (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 qtycon :: { LocatedN RdrName }   -- Qualified or unqualified
         : QCONID            { sL1n $1 $! mkQual tcClsName (getQCONID $1) }
@@ -3902,7 +3901,7 @@ tyconsym :: { LocatedN RdrName }
 otycon :: { LocatedN RdrName }
         : tycon                 { $1 }
         | '(' tyconsym ')'      {% amsr (sLL $1 $> (unLoc $2))
-                                        (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                        (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
 
 -----------------------------------------------------------------------------
 -- Operators
@@ -3911,12 +3910,12 @@ op      :: { LocatedN RdrName }   -- used in infix decls
         : varop                 { $1 }
         | conop                 { $1 }
         | '->'                  {% amsr (sLL $1 $> $ getRdrName unrestrictedFunTyCon)
-                                     (NameAnnRArrow (isUnicode $1) Nothing (glR $1) Nothing []) }
+                                     (NameAnnRArrow  Nothing (epUniTok $1) Nothing []) }
 
 varop   :: { LocatedN RdrName }
         : varsym                { $1 }
         | '`' varid '`'         {% amsr (sLL $1 $> (unLoc $2))
-                                           (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                           (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 qop     :: { forall b. DisambInfixOp b => PV (LocatedN b) }   -- used in sections
         : qvarop                { mkHsVarOpPV $1 }
@@ -3934,12 +3933,12 @@ hole_op : '`' '_' '`'           { sLLa $1 $> (hsHoleExpr (Just $ EpAnnUnboundVar
 qvarop :: { LocatedN RdrName }
         : qvarsym               { $1 }
         | '`' qvarid '`'        {% amsr (sLL $1 $> (unLoc $2))
-                                           (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                           (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 qvaropm :: { LocatedN RdrName }
         : qvarsym_no_minus      { $1 }
         | '`' qvarid '`'        {% amsr (sLL $1 $> (unLoc $2))
-                                           (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                           (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 -----------------------------------------------------------------------------
 -- Type variables
@@ -3949,7 +3948,7 @@ tyvar   : tyvarid               { $1 }
 
 tyvarop :: { LocatedN RdrName }
 tyvarop : '`' tyvarid '`'       {% amsr (sLL $1 $> (unLoc $2))
-                                           (NameAnn NameBackquotes (glR $1) (glR $2) (glR $3) []) }
+                                           (NameAnn (NameBackquotes (epTok $1) (epTok $3)) (glR $2) []) }
 
 tyvarid :: { LocatedN RdrName }
         : VARID            { sL1n $1 $! mkUnqual tvName (getVARID $1) }
@@ -3967,14 +3966,14 @@ tyvarid :: { LocatedN RdrName }
 var     :: { LocatedN RdrName }
         : varid                 { $1 }
         | '(' varsym ')'        {% amsr (sLL $1 $> (unLoc $2))
-                                   (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                   (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
 
 qvar    :: { LocatedN RdrName }
         : qvarid                { $1 }
         | '(' varsym ')'        {% amsr (sLL $1 $> (unLoc $2))
-                                   (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                   (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
         | '(' qvarsym1 ')'      {% amsr (sLL $1 $> (unLoc $2))
-                                   (NameAnn NameParens (glR $1) (glR $2) (glR $3) []) }
+                                   (NameAnn (NameParens (epTok $1) (epTok $3)) (glR $2) []) }
 -- We've inlined qvarsym here so that the decision about
 -- whether it's a qvar or a var can be postponed until
 -- *after* we see the close paren.
@@ -4476,14 +4475,6 @@ in GHC.Parser.Annotation
 
 -}
 
--- |Construct an AddEpAnn from the annotation keyword and the location
--- of the keyword itself
-mj :: AnnKeywordId -> Located e -> AddEpAnn
-mj !a !l = AddEpAnn a (srcSpan2e $ gl l)
-
-mjN :: AnnKeywordId -> LocatedN e -> AddEpAnn
-mjN !a !l = AddEpAnn a (srcSpan2e $ glA l)
-
 msemi :: Located e -> [TrailingAnn]
 msemi !l = if isZeroWidthSpan (gl l) then [] else [AddSemiAnn (srcSpan2e $ gl l)]
 
@@ -4493,12 +4484,6 @@ msemiA !l = if isZeroWidthSpan (gl l) then [] else [EpTok (srcSpan2e $ gl l)]
 msemim :: Located e -> Maybe EpaLocation
 msemim !l = if isZeroWidthSpan (gl l) then Nothing else Just (srcSpan2e $ gl l)
 
--- |Construct an AddEpAnn from the annotation keyword and the Located Token. If
--- the token has a unicode equivalent and this has been used, provide the
--- unicode variant of the annotation.
-mu :: AnnKeywordId -> Located Token -> AddEpAnn
-mu !a lt@(L l t) = AddEpAnn (toUnicodeAnn a lt) (srcSpan2e l)
-
 -- | If the 'Token' is using its unicode variant return the unicode variant of
 --   the annotation
 toUnicodeAnn :: AnnKeywordId -> Located Token -> AnnKeywordId
@@ -4579,27 +4564,6 @@ amsr (L l a) an = do
   !cs <- getCommentsFor l
   return (L (EpAnn (spanAsAnchor l) an cs) a)
 
--- |Synonyms for AddEpAnn versions of AnnOpen and AnnClose
-mo,mc :: Located Token -> AddEpAnn
-mo !ll = mj AnnOpen ll
-mc !ll = mj AnnClose ll
-
-moc,mcc :: Located Token -> AddEpAnn
-moc !ll = mj AnnOpenC ll
-mcc !ll = mj AnnCloseC ll
-
-mop,mcp :: Located Token -> AddEpAnn
-mop !ll = mj AnnOpenP ll
-mcp !ll = mj AnnCloseP ll
-
-moh,mch :: Located Token -> AddEpAnn
-moh !ll = mj AnnOpenPH ll
-mch !ll = mj AnnClosePH ll
-
-mos,mcs :: Located Token -> AddEpAnn
-mos !ll = mj AnnOpenS ll
-mcs !ll = mj AnnCloseS ll
-
 -- | Parse a Haskell module with Haddock comments. This is done in two steps:
 --
 -- * 'parseModuleNoHaddock' to build the AST
@@ -4641,11 +4605,7 @@ commentsPA la@(L l a) = do
 
 hsDoAnn :: EpToken "rec" -> LocatedAn t b -> AnnList (EpToken "rec")
 hsDoAnn tok (L ll _)
-  = AnnList (Just $ spanAsAnchor (locA ll)) Nothing Nothing [] tok []
-
-listAsAnchor :: [LocatedAn t a] -> Located b -> EpaLocation
-listAsAnchor [] (L l _) = spanAsAnchor l
-listAsAnchor (h:_) s = spanAsAnchor (comb2 h s)
+  = AnnList (Just $ spanAsAnchor (locA ll)) ListNone [] tok []
 
 listAsAnchorM :: [LocatedAn t a] -> Maybe EpaLocation
 listAsAnchorM [] = Nothing
@@ -4730,7 +4690,7 @@ addTrailingDarrowC :: LocatedC a -> Located Token -> EpAnnComments -> LocatedC a
 addTrailingDarrowC (L (EpAnn lr (AnnContext _ o c) csc) a) lt cs =
   let
     u = if (isUnicode lt) then UnicodeSyntax else NormalSyntax
-  in L (EpAnn lr (AnnContext (Just (u,glR lt)) o c) (cs Semi.<> csc)) a
+  in L (EpAnn lr (AnnContext (Just (epUniTok lt)) o c) (cs Semi.<> csc)) a
 
 -- -------------------------------------
 
diff --git a/compiler/GHC/Parser/Annotation.hs b/compiler/GHC/Parser/Annotation.hs
index 141547333c3cff363ff8b3d8efd66997f6fe44a2..f84e54e2261e3eb675ee623c2371e2d113360583 100644
--- a/compiler/GHC/Parser/Annotation.hs
+++ b/compiler/GHC/Parser/Annotation.hs
@@ -10,7 +10,8 @@ module GHC.Parser.Annotation (
   -- * Core Exact Print Annotation types
   AnnKeywordId(..),
   EpToken(..), EpUniToken(..),
-  getEpTokenSrcSpan, getEpTokenLocs, getEpTokenLoc,
+  getEpTokenSrcSpan,
+  getEpTokenLocs, getEpTokenLoc, getEpUniTokenLoc,
   TokDcolon, TokDarrow, TokRarrow, TokForall,
   EpLayout(..),
   EpaComment(..), EpaCommentTok(..),
@@ -19,7 +20,6 @@ module GHC.Parser.Annotation (
   HasE(..),
 
   -- * In-tree Exact Print Annotations
-  AddEpAnn(..), addEpAnnLoc,
   EpaLocation, EpaLocation'(..), epaLocationRealSrcSpan,
   TokenLocation(..),
   DeltaPos(..), deltaPos, getDeltaLine,
@@ -46,8 +46,8 @@ module GHC.Parser.Annotation (
 
   -- ** Annotation data types used in 'GenLocated'
 
-  AnnListItem(..), AnnList(..),
-  AnnParen(..), ParenType(..), parenTypeKws,
+  AnnListItem(..), AnnList(..), AnnListBrackets(..),
+  AnnParen(..),
   AnnPragma(..),
   AnnContext(..),
   NameAnn(..), NameAdornment(..),
@@ -55,7 +55,7 @@ module GHC.Parser.Annotation (
   AnnSortKey(..), DeclTag(..), BindTag(..),
 
   -- ** Trailing annotations in lists
-  TrailingAnn(..), trailingAnnToAddEpAnn,
+  TrailingAnn(..),
   addTrailingAnnToA, addTrailingAnnToL, addTrailingCommaToN,
   noTrailingN,
 
@@ -411,6 +411,10 @@ getEpTokenLoc :: EpToken tok -> EpaLocation
 getEpTokenLoc NoEpTok   = noAnn
 getEpTokenLoc (EpTok l) = l
 
+getEpUniTokenLoc :: EpUniToken tok toku -> EpaLocation
+getEpUniTokenLoc NoEpUniTok     = noAnn
+getEpUniTokenLoc (EpUniTok l _) = l
+
 -- TODO:AZ: check we have all of the unicode tokens
 type TokDcolon = EpUniToken "::" "∷"
 type TokDarrow = EpUniToken "=>"  "⇒"
@@ -472,20 +476,6 @@ instance Outputable EpaComment where
 
 -- ---------------------------------------------------------------------
 
--- | Captures an annotation, storing the @'AnnKeywordId'@ and its
--- location.  The parser only ever inserts @'EpaLocation'@ fields with a
--- RealSrcSpan being the original location of the annotation in the
--- source file.
--- The @'EpaLocation'@ can also store a delta position if the AST has been
--- modified and needs to be pretty printed again.
--- The usual way an 'AddEpAnn' is created is using the 'mj' ("make
--- jump") function, and then it can be inserted into the appropriate
--- annotation.
-data AddEpAnn = AddEpAnn AnnKeywordId EpaLocation deriving (Data,Eq)
-
-addEpAnnLoc :: AddEpAnn -> EpaLocation
-addEpAnnLoc (AddEpAnn _ l) = l
-
 type EpaLocation = EpaLocation' [LEpaComment]
 
 epaToNoCommentsLocation :: EpaLocation -> NoCommentsLocation
@@ -512,9 +502,6 @@ epaLocationRealSrcSpan :: EpaLocation -> RealSrcSpan
 epaLocationRealSrcSpan (EpaSpan (RealSrcSpan r _)) = r
 epaLocationRealSrcSpan _ = panic "epaLocationRealSrcSpan"
 
-instance Outputable AddEpAnn where
-  ppr (AddEpAnn kw ss) = text "AddEpAnn" <+> ppr kw <+> ppr ss
-
 -- ---------------------------------------------------------------------
 
 -- | The exact print annotations (EPAs) are kept in the HsSyn AST for
@@ -701,8 +688,7 @@ data AnnListItem
 data AnnList a
   = AnnList {
       al_anchor    :: !(Maybe EpaLocation), -- ^ start point of a list having layout
-      al_open      :: !(Maybe AddEpAnn),
-      al_close     :: !(Maybe AddEpAnn),
+      al_brackets  :: !AnnListBrackets,
       al_semis     :: [EpToken ";"], -- decls
       al_rest      :: !a,
       al_trailing  :: ![TrailingAnn] -- ^ items appearing after the
@@ -710,6 +696,14 @@ data AnnList a
                                      -- context
       } deriving (Data,Eq)
 
+data AnnListBrackets
+  = ListParens (EpToken "(")         (EpToken ")")
+  | ListBraces (EpToken "{")         (EpToken "}")
+  | ListSquare (EpToken "[")         (EpToken "]")
+  | ListBanana (EpUniToken "(|" "⦇") (EpUniToken "|)"  "⦈")
+  | ListNone
+  deriving (Data,Eq)
+
 -- ---------------------------------------------------------------------
 -- Annotations for parenthesised elements, such as tuples, lists
 -- ---------------------------------------------------------------------
@@ -717,35 +711,20 @@ data AnnList a
 -- | exact print annotation for an item having surrounding "brackets", such as
 -- tuples or lists
 data AnnParen
-  = AnnParen {
-      ap_adornment :: ParenType,
-      ap_open      :: EpaLocation,
-      ap_close     :: EpaLocation
-      } deriving (Data)
-
--- | Detail of the "brackets" used in an 'AnnParen' exact print annotation.
-data ParenType
-  = AnnParens       -- ^ '(', ')'
-  | AnnParensHash   -- ^ '(#', '#)'
-  | AnnParensSquare -- ^ '[', ']'
-  deriving (Eq, Ord, Data, Show)
-
--- | Maps the 'ParenType' to the related opening and closing
--- AnnKeywordId. Used when actually printing the item.
-parenTypeKws :: ParenType -> (AnnKeywordId, AnnKeywordId)
-parenTypeKws AnnParens       = (AnnOpenP, AnnCloseP)
-parenTypeKws AnnParensHash   = (AnnOpenPH, AnnClosePH)
-parenTypeKws AnnParensSquare = (AnnOpenS, AnnCloseS)
+  = AnnParens       (EpToken "(")  (EpToken ")")  -- ^ '(', ')'
+  | AnnParensHash   (EpToken "(#") (EpToken "#)") -- ^ '(#', '#)'
+  | AnnParensSquare (EpToken "[")  (EpToken "]")  -- ^ '[', ']'
+  deriving Data
 
 -- ---------------------------------------------------------------------
 
 -- | Exact print annotation for the 'Context' data type.
 data AnnContext
   = AnnContext {
-      ac_darrow    :: Maybe (IsUnicodeSyntax, EpaLocation),
-                      -- ^ location and encoding of the '=>', if present.
-      ac_open      :: [EpaLocation], -- ^ zero or more opening parentheses.
-      ac_close     :: [EpaLocation]  -- ^ zero or more closing parentheses.
+      ac_darrow    :: Maybe TokDarrow,
+                      -- ^ location of the '=>', if present.
+      ac_open      :: [EpToken "("], -- ^ zero or more opening parentheses.
+      ac_close     :: [EpToken ")"]  -- ^ zero or more closing parentheses.
       } deriving (Data)
 
 
@@ -760,46 +739,37 @@ data NameAnn
   -- | Used for a name with an adornment, so '`foo`', '(bar)'
   = NameAnn {
       nann_adornment :: NameAdornment,
-      nann_open      :: EpaLocation,
       nann_name      :: EpaLocation,
-      nann_close     :: EpaLocation,
       nann_trailing  :: [TrailingAnn]
       }
   -- | Used for @(,,,)@, or @(#,,,#)@
   | NameAnnCommas {
       nann_adornment :: NameAdornment,
-      nann_open      :: EpaLocation,
       nann_commas    :: [EpaLocation],
-      nann_close     :: EpaLocation,
       nann_trailing  :: [TrailingAnn]
       }
   -- | Used for @(# | | #)@
   | NameAnnBars {
-      nann_adornment :: NameAdornment,
-      nann_open      :: EpaLocation,
+      nann_parensh   :: (EpToken "(#", EpToken "#)"),
       nann_bars      :: [EpaLocation],
-      nann_close     :: EpaLocation,
       nann_trailing  :: [TrailingAnn]
       }
   -- | Used for @()@, @(##)@, @[]@
   | NameAnnOnly {
       nann_adornment :: NameAdornment,
-      nann_open      :: EpaLocation,
-      nann_close     :: EpaLocation,
       nann_trailing  :: [TrailingAnn]
       }
   -- | Used for @->@, as an identifier
   | NameAnnRArrow {
-      nann_unicode   :: Bool,
-      nann_mopen     :: Maybe EpaLocation,
-      nann_name      :: EpaLocation,
-      nann_mclose    :: Maybe EpaLocation,
+      nann_mopen     :: Maybe (EpToken "("),
+      nann_arrow     :: TokRarrow,
+      nann_mclose    :: Maybe (EpToken ")"),
       nann_trailing  :: [TrailingAnn]
       }
   -- | Used for an item with a leading @'@. The annotation for
   -- unquoted item is stored in 'nann_quoted'.
   | NameAnnQuote {
-      nann_quote     :: EpaLocation,
+      nann_quote     :: EpToken "'",
       nann_quoted    :: SrcSpanAnnN,
       nann_trailing  :: [TrailingAnn]
       }
@@ -814,11 +784,13 @@ data NameAnn
 -- such as parens or backquotes. This data type identifies what
 -- particular pair are being used.
 data NameAdornment
-  = NameParens -- ^ '(' ')'
-  | NameParensHash -- ^ '(#' '#)'
-  | NameBackquotes -- ^ '`'
-  | NameSquare -- ^ '[' ']'
-  deriving (Eq, Ord, Data)
+  = NameParens     (EpToken "(")  (EpToken ")") -- ^ '(' ')'
+  | NameParensHash (EpToken "(#") (EpToken "#)")-- ^ '(#' '#)'
+  | NameBackquotes (EpToken "`")  (EpToken "`")-- ^ '`'
+  | NameSquare     (EpToken "[")  (EpToken "]")-- ^ '[' ']'
+  | NameNoAdornment
+  deriving (Eq, Data)
+
 
 -- ---------------------------------------------------------------------
 
@@ -951,14 +923,6 @@ different lists we must manage. For this we use DeclTag.
 
 -- ---------------------------------------------------------------------
 
--- | Convert a 'TrailingAnn' to an 'AddEpAnn'
-trailingAnnToAddEpAnn :: TrailingAnn -> AddEpAnn
-trailingAnnToAddEpAnn (AddSemiAnn ss)    = AddEpAnn AnnSemi ss
-trailingAnnToAddEpAnn (AddCommaAnn ss)   = AddEpAnn AnnComma ss
-trailingAnnToAddEpAnn (AddVbarAnn ss)    = AddEpAnn AnnVbar ss
-trailingAnnToAddEpAnn (AddDarrowUAnn ss) = AddEpAnn AnnDarrowU ss
-trailingAnnToAddEpAnn (AddDarrowAnn ss)  = AddEpAnn AnnDarrow ss
-
 -- | Helper function used in the parser to add a 'TrailingAnn' items
 -- to an existing annotation.
 addTrailingAnnToL :: TrailingAnn -> EpAnnComments
@@ -1324,15 +1288,15 @@ instance NoAnn EpaLocation where
 instance NoAnn AnnKeywordId where
   noAnn = Annlarrowtail  {- gotta pick one -}
 
-instance NoAnn AddEpAnn where
-  noAnn = AddEpAnn noAnn noAnn
-
 instance NoAnn [a] where
   noAnn = []
 
 instance NoAnn (Maybe a) where
   noAnn = Nothing
 
+instance NoAnn a => NoAnn (Either a b) where
+  noAnn = Left noAnn
+
 instance (NoAnn a, NoAnn b) => NoAnn (a, b) where
   noAnn = (noAnn, noAnn)
 
@@ -1361,7 +1325,7 @@ instance NoAnn AnnContext where
   noAnn = AnnContext Nothing [] []
 
 instance NoAnn a => NoAnn (AnnList a) where
-  noAnn = AnnList Nothing Nothing Nothing noAnn noAnn []
+  noAnn = AnnList Nothing ListNone noAnn noAnn []
 
 instance NoAnn NameAnn where
   noAnn = NameAnnTrailing []
@@ -1370,7 +1334,7 @@ instance NoAnn AnnPragma where
   noAnn = AnnPragma noAnn noAnn noAnn noAnn noAnn noAnn noAnn
 
 instance NoAnn AnnParen where
-  noAnn = AnnParen AnnParens noAnn noAnn
+  noAnn = AnnParens noAnn noAnn
 
 instance NoAnn (EpToken s) where
   noAnn = NoEpTok
@@ -1428,37 +1392,47 @@ instance (Outputable e)
      => Outputable (GenLocated EpaLocation e) where
   ppr = pprLocated
 
-instance Outputable ParenType where
-  ppr t = text (show t)
+instance Outputable AnnParen where
+  ppr (AnnParens       o c) = text "AnnParens" <+> ppr o <+> ppr c
+  ppr (AnnParensHash   o c) = text "AnnParensHash" <+> ppr o <+> ppr c
+  ppr (AnnParensSquare o c) = text "AnnParensSquare" <+> ppr o <+> ppr c
 
 instance Outputable AnnListItem where
   ppr (AnnListItem ts) = text "AnnListItem" <+> ppr ts
 
 instance Outputable NameAdornment where
-  ppr NameParens     = text "NameParens"
-  ppr NameParensHash = text "NameParensHash"
-  ppr NameBackquotes = text "NameBackquotes"
-  ppr NameSquare     = text "NameSquare"
+  ppr (NameParens     o c) = text "NameParens" <+> ppr o <+> ppr c
+  ppr (NameParensHash o c) = text "NameParensHash" <+> ppr o <+> ppr c
+  ppr (NameBackquotes o c) = text "NameBackquotes" <+> ppr o <+> ppr c
+  ppr (NameSquare     o c) = text "NameSquare" <+> ppr o <+> ppr c
+  ppr NameNoAdornment      = text "NameNoAdornment"
 
 instance Outputable NameAnn where
-  ppr (NameAnn a o n c t)
-    = text "NameAnn" <+> ppr a <+> ppr o <+> ppr n <+> ppr c <+> ppr t
-  ppr (NameAnnCommas a o n c t)
-    = text "NameAnnCommas" <+> ppr a <+> ppr o <+> ppr n <+> ppr c <+> ppr t
-  ppr (NameAnnBars a o n b t)
-    = text "NameAnnBars" <+> ppr a <+> ppr o <+> ppr n <+> ppr b <+> ppr t
-  ppr (NameAnnOnly a o c t)
-    = text "NameAnnOnly" <+> ppr a <+> ppr o <+> ppr c <+> ppr t
-  ppr (NameAnnRArrow u o n c t)
-    = text "NameAnnRArrow" <+> ppr u <+> ppr o <+> ppr n <+> ppr c <+> ppr t
+  ppr (NameAnn a n t)
+    = text "NameAnn" <+> ppr a <+> ppr n <+> ppr t
+  ppr (NameAnnCommas a n t)
+    = text "NameAnnCommas" <+> ppr a <+> ppr n <+> ppr t
+  ppr (NameAnnBars a n t)
+    = text "NameAnnBars" <+> ppr a <+> ppr n <+> ppr t
+  ppr (NameAnnOnly a t)
+    = text "NameAnnOnly" <+> ppr a <+> ppr t
+  ppr (NameAnnRArrow o n c t)
+    = text "NameAnnRArrow" <+> ppr o <+> ppr n <+> ppr c <+> ppr t
   ppr (NameAnnQuote q n t)
     = text "NameAnnQuote" <+> ppr q <+> ppr n <+> ppr t
   ppr (NameAnnTrailing t)
     = text "NameAnnTrailing" <+> ppr t
 
 instance (Outputable a) => Outputable (AnnList a) where
-  ppr (AnnList anc o c s a t)
-    = text "AnnList" <+> ppr anc <+> ppr o <+> ppr c <+> ppr s <+> ppr a <+> ppr t
+  ppr (AnnList anc p s a t)
+    = text "AnnList" <+> ppr anc <+> ppr p <+> ppr s <+> ppr a <+> ppr t
+
+instance Outputable AnnListBrackets where
+  ppr (ListParens o c) = text "ListParens" <+> ppr o <+> ppr c
+  ppr (ListBraces o c) = text "ListBraces" <+> ppr o <+> ppr c
+  ppr (ListSquare o c) = text "ListSquare" <+> ppr o <+> ppr c
+  ppr (ListBanana o c) = text "ListBanana" <+> ppr o <+> ppr c
+  ppr ListNone         = text "ListNone"
 
 instance Outputable AnnPragma where
   ppr (AnnPragma o c s l ca t m)
diff --git a/compiler/GHC/Parser/Lexer.x b/compiler/GHC/Parser/Lexer.x
index 28a30bf081d6c4ed03fd8e669a384366d22108f4..2aed5ab9da00cfa83aa5e769426e3ab8f1cb7f1a 100644
--- a/compiler/GHC/Parser/Lexer.x
+++ b/compiler/GHC/Parser/Lexer.x
@@ -3631,7 +3631,7 @@ warn_unknown_prag prags span buf len buf2 = do
 -- TODO:AZ: we should have only mkParensEpToks. Delee mkParensEpAnn, mkParensLocs
 
 -- |Given a 'RealSrcSpan' that surrounds a 'HsPar' or 'HsParTy', generate
--- 'AddEpAnn' values for the opening and closing bordering on the start
+-- 'EpToken' values for the opening and closing bordering on the start
 -- and end of the span
 mkParensEpToks :: RealSrcSpan -> (EpToken "(", EpToken ")")
 mkParensEpToks ss = (EpTok (EpaSpan (RealSrcSpan lo Strict.Nothing)),
diff --git a/compiler/GHC/Parser/PostProcess.hs b/compiler/GHC/Parser/PostProcess.hs
index 791ad3fccb32e15a4ab77dad7145f09aa5ae89c5..146d311bb012f31397ff68e414b61cd14a6f3f72 100644
--- a/compiler/GHC/Parser/PostProcess.hs
+++ b/compiler/GHC/Parser/PostProcess.hs
@@ -432,7 +432,7 @@ mkRoleAnnotDecl loc tycon roles anns
 
 mkMDo :: HsDoFlavour -> LocatedLW [ExprLStmt GhcPs] -> EpaLocation -> EpaLocation -> HsExpr GhcPs
 mkMDo ctxt stmts tok loc
-  = mkHsDoAnns ctxt stmts (AnnList (Just loc) Nothing Nothing [] tok [])
+  = mkHsDoAnns ctxt stmts (AnnList (Just loc) ListNone [] tok [])
 
 -- | Converts a list of 'LHsTyVarBndr's annotated with their 'Specificity' to
 -- binders without annotations. Only accepts specified variables, and errors if
@@ -984,7 +984,7 @@ checkTyVars pp_what equals_or_where tc tparms
       = Just (noAnn, HsBndrWildCard noExtField)
     match_bndr_var _ = Nothing
 
-    -- Return an AddEpAnn for use in widenLocatedAnL. The AnnKeywordId is not used.
+    -- Return a EpaLocation for use in widenLocatedAnL.
     for_widening :: HsBndrVis GhcPs -> EpaLocation
     for_widening (HsBndrInvisible (EpTok loc)) = loc
     for_widening  _                            = noAnn
@@ -1102,7 +1102,7 @@ checkTyClHdr is_cls ty
       let
         lr = combineSrcSpans (locA l1) (locA l)
       in
-        EpAnn (EpaSpan lr) (NameAnn NameParens (getEpTokenLoc o) ap (getEpTokenLoc c) ta) (csp0 Semi.<> csp)
+        EpAnn (EpaSpan lr) (NameAnn (NameParens o c) ap ta) (csp0 Semi.<> csp)
 
 -- | Yield a parse error if we have a function applied directly to a do block
 -- etc. and BlockArguments is not enabled.
@@ -1148,13 +1148,13 @@ checkContext :: LHsType GhcPs -> P (LHsContext GhcPs)
 checkContext orig_t@(L (EpAnn l _ cs) _orig_t) =
   check ([],[],cs) orig_t
  where
-  check :: ([EpaLocation],[EpaLocation],EpAnnComments)
+  check :: ([EpToken "("],[EpToken ")"],EpAnnComments)
         -> LHsType GhcPs -> P (LHsContext GhcPs)
-  check (oparens,cparens,cs) (L _l (HsTupleTy ann' HsBoxedOrConstraintTuple ts))
+  check (oparens,cparens,cs) (L _l (HsTupleTy (AnnParens o c) HsBoxedOrConstraintTuple ts))
     -- (Eq a, Ord b) shows up as a tuple type. Only boxed tuples can
     -- be used as context constraints.
     -- Ditto ()
-    = mkCTuple (oparens ++ [ap_open ann'], ap_close ann' : cparens, cs) ts
+    = mkCTuple (oparens ++ [o], c : cparens, cs) ts
 
   -- With NoListTuplePuns, contexts are parsed as data constructors, which causes failure
   -- downstream.
@@ -1164,15 +1164,13 @@ checkContext orig_t@(L (EpAnn l _ cs) _orig_t) =
       True -> unprocessed
       False -> do
         let
-          ol = AddEpAnn AnnOpenP (getEpTokenLoc o)
-          cl = AddEpAnn AnnCloseP (getEpTokenLoc c)
           (op, cp) = case q of
-            EpTok ql -> ([AddEpAnn AnnSimpleQuote ql], [cl])
-            _        -> ([ol], [cl])
-        mkCTuple (oparens ++ (addLoc <$> op), (addLoc <$> cp) ++ cparens, cs) ts
+            EpTok ql -> ([EpTok ql], [c])
+            _        -> ([o], [c])
+        mkCTuple (oparens ++ op, cp ++ cparens, cs) ts
   check (opi,cpi,csi) (L _lp1 (HsParTy (o,c) ty))
                                              -- to be sure HsParTy doesn't get into the way
-    = check (getEpTokenLoc o:opi, getEpTokenLoc c:cpi, csi) ty
+    = check (o:opi, c:cpi, csi) ty
 
   -- No need for anns, returning original
   check (_opi,_cpi,_csi) _t = unprocessed
@@ -1180,7 +1178,6 @@ checkContext orig_t@(L (EpAnn l _ cs) _orig_t) =
   unprocessed =
     return (L (EpAnn l (AnnContext Nothing [] []) emptyComments) [orig_t])
 
-  addLoc (AddEpAnn _ l) = l
 
   mkCTuple (oparens, cparens, cs) ts =
     -- Append parens so that the original order in the source is maintained
@@ -1201,16 +1198,16 @@ checkContextExpr :: LHsExpr GhcPs -> PV (LocatedC [LHsExpr GhcPs])
 checkContextExpr orig_expr@(L (EpAnn l _ cs) _) =
   check ([],[], cs) orig_expr
   where
-    check :: ([EpaLocation],[EpaLocation],EpAnnComments)
+    check :: ([EpToken "("],[EpToken ")"],EpAnnComments)
         -> LHsExpr GhcPs -> PV (LocatedC [LHsExpr GhcPs])
     check (oparens,cparens,cs) (L _ (ExplicitTuple (ap_open, ap_close) tup_args boxity))
              -- Neither unboxed tuples (#e1,e2#) nor tuple sections (e1,,e2,) can be a context
       | isBoxed boxity
       , Just es <- tupArgsPresent_maybe tup_args
-      = mkCTuple (oparens ++ [ap_open], ap_close : cparens, cs) es
-    check (opi, cpi, csi) (L _ (HsPar (EpTok open_tok, EpTok close_tok) expr))
+      = mkCTuple (oparens ++ [EpTok ap_open], EpTok ap_close : cparens, cs) es
+    check (opi, cpi, csi) (L _ (HsPar (open_tok, close_tok) expr))
       = check (opi ++ [open_tok], close_tok : cpi, csi) expr
-    check (oparens,cparens,cs) (L _ (HsVar _ (L (EpAnn _ (NameAnnOnly NameParens open closed []) _) name)))
+    check (oparens,cparens,cs) (L _ (HsVar _ (L (EpAnn _ (NameAnnOnly (NameParens open closed) []) _) name)))
       | name == nameRdrName (dataConName unitDataCon)
       = mkCTuple (oparens ++ [open], closed : cparens, cs) []
     check _ _ = unprocessed
@@ -1842,7 +1839,7 @@ instance DisambECP (HsCmd GhcPs) where
     return $ L (EpAnn (spanAsAnchor l) noAnn cs) (mkHsCmdIf c a b anns)
   mkHsDoPV l Nothing stmts tok_loc anc = do
     !cs <- getCommentsFor l
-    return $ L (EpAnn (spanAsAnchor l) noAnn cs) (HsCmdDo (AnnList (Just anc) Nothing Nothing [] tok_loc []) stmts)
+    return $ L (EpAnn (spanAsAnchor l) noAnn cs) (HsCmdDo (AnnList (Just anc) ListNone [] tok_loc []) stmts)
   mkHsDoPV l (Just m)    _ _ _ = addFatalError $ mkPlainErrorMsgEnvelope l $ PsErrQualifiedDoInCmd m
   mkHsParPV l lpar c rpar = do
     !cs <- getCommentsFor l
@@ -1939,7 +1936,7 @@ instance DisambECP (HsExpr GhcPs) where
     return $ L (EpAnn (spanAsAnchor l) noAnn cs) (mkHsIf c a b anns)
   mkHsDoPV l mod stmts loc_tok anc = do
     !cs <- getCommentsFor l
-    return $ L (EpAnn (spanAsAnchor l) noAnn cs) (HsDo (AnnList (Just anc) Nothing Nothing [] loc_tok []) (DoExpr mod) stmts)
+    return $ L (EpAnn (spanAsAnchor l) noAnn cs) (HsDo (AnnList (Just anc) ListNone [] loc_tok []) (DoExpr mod) stmts)
   mkHsParPV l lpar e rpar = do
     !cs <- getCommentsFor l
     return $ L (EpAnn (spanAsAnchor l) noAnn cs) (HsPar (lpar, rpar) e)
@@ -3614,9 +3611,9 @@ withCombinedComments start end use = do
 -- type or data constructor, based on the extension @ListTuplePuns@.
 -- The case with an explicit promotion quote, @'(Int, Double)@, is handled
 -- by 'mkExplicitTupleTy'.
-mkTupleSyntaxTy :: EpaLocation
+mkTupleSyntaxTy :: EpToken "("
                 -> [LocatedA (HsType GhcPs)]
-                -> EpaLocation
+                -> EpToken ")"
                 -> P (HsType GhcPs)
 mkTupleSyntaxTy parOpen args parClose =
   punsIfElse enabled disabled
@@ -3626,8 +3623,8 @@ mkTupleSyntaxTy parOpen args parClose =
     disabled =
       HsExplicitTupleTy annsKeyword args
 
-    annParen = AnnParen AnnParens parOpen parClose
-    annsKeyword = (NoEpTok, EpTok parOpen, EpTok parClose)
+    annParen = AnnParens parOpen parClose
+    annsKeyword = (NoEpTok, parOpen, parClose)
 
 -- | Decide whether to parse tuple con syntax @(,)@ in a type as a
 -- type or data constructor, based on the extension @ListTuplePuns@.
@@ -3643,8 +3640,8 @@ mkTupleSyntaxTycon boxity n =
 -- constructor, based on the extension @ListTuplePuns@.
 -- The case with an explicit promotion quote, @'[]@, is handled by
 -- 'mkExplicitListTy'.
-mkListSyntaxTy0 :: EpaLocation
-                -> EpaLocation
+mkListSyntaxTy0 :: EpToken "["
+                -> EpToken "]"
                 -> SrcSpan
                 -> P (HsType GhcPs)
 mkListSyntaxTy0 brkOpen brkClose span =
@@ -3658,17 +3655,17 @@ mkListSyntaxTy0 brkOpen brkClose span =
     disabled =
       HsExplicitListTy annsKeyword NotPromoted []
 
-    rdrNameAnn = NameAnnOnly NameSquare brkOpen brkClose []
-    annsKeyword = (NoEpTok, EpTok brkOpen, EpTok brkClose)
+    rdrNameAnn = NameAnnOnly (NameSquare brkOpen brkClose) []
+    annsKeyword = (NoEpTok, brkOpen, brkClose)
     fullLoc = EpaSpan span
 
 -- | Decide whether to parse list type syntax @[Int]@ in a type as a
 -- type or data constructor, based on the extension @ListTuplePuns@.
 -- The case with an explicit promotion quote, @'[Int]@, is handled
 -- by 'mkExplicitListTy'.
-mkListSyntaxTy1 :: EpaLocation
+mkListSyntaxTy1 :: EpToken "["
                 -> LocatedA (HsType GhcPs)
-                -> EpaLocation
+                -> EpToken "]"
                 -> P (HsType GhcPs)
 mkListSyntaxTy1 brkOpen t brkClose =
   punsIfElse enabled disabled
@@ -3678,5 +3675,5 @@ mkListSyntaxTy1 brkOpen t brkClose =
     disabled =
       HsExplicitListTy annsKeyword NotPromoted [t]
 
-    annsKeyword = (NoEpTok, EpTok brkOpen, EpTok brkClose)
-    annParen = AnnParen AnnParensSquare brkOpen brkClose
+    annsKeyword = (NoEpTok, brkOpen, brkClose)
+    annParen = AnnParensSquare brkOpen brkClose
diff --git a/testsuite/tests/ghc-api/exactprint/T22919.stderr b/testsuite/tests/ghc-api/exactprint/T22919.stderr
index 7de5790406a3a3569dc2697de1e0dd601b2cb389..cbda59b70c973ff27cb8179328c9beac4ed0b8f7 100644
--- a/testsuite/tests/ghc-api/exactprint/T22919.stderr
+++ b/testsuite/tests/ghc-api/exactprint/T22919.stderr
@@ -70,8 +70,7 @@
          (EpaSpan { T22919.hs:2:1-9 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -119,7 +118,9 @@
                 (EpaSpan { T22919.hs:2:5-9 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { T22919.hs:2:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { T22919.hs:2:5 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/ghc-api/exactprint/Test20239.stderr b/testsuite/tests/ghc-api/exactprint/Test20239.stderr
index 263b815b17bf1d31a4f451281b4fcaca30a15fda..8f710f550db4a71f000a9f3ff220bf14bac174e4 100644
--- a/testsuite/tests/ghc-api/exactprint/Test20239.stderr
+++ b/testsuite/tests/ghc-api/exactprint/Test20239.stderr
@@ -366,10 +366,11 @@
                             (EpaComments
                              []))
                            (HsTupleTy
-                            (AnnParen
-                             AnnParens
-                             (EpaSpan { Test20239.hs:7:83 })
-                             (EpaSpan { Test20239.hs:7:84 }))
+                            (AnnParens
+                             (EpTok
+                              (EpaSpan { Test20239.hs:7:83 }))
+                             (EpTok
+                              (EpaSpan { Test20239.hs:7:84 })))
                             (HsBoxedOrConstraintTuple)
                             [])))))))))))))])
              (Nothing)))])
diff --git a/testsuite/tests/ghc-api/exactprint/ZeroWidthSemi.stderr b/testsuite/tests/ghc-api/exactprint/ZeroWidthSemi.stderr
index dbb7d938d748775ee328806b8b8d0ea3fc60f5a1..8a1db6bb1e8372c094ab6cb1cd0041b465bd94bd 100644
--- a/testsuite/tests/ghc-api/exactprint/ZeroWidthSemi.stderr
+++ b/testsuite/tests/ghc-api/exactprint/ZeroWidthSemi.stderr
@@ -82,8 +82,7 @@
          (EpaSpan { ZeroWidthSemi.hs:6:1-5 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -131,7 +130,9 @@
                 (EpaSpan { ZeroWidthSemi.hs:6:3-5 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { ZeroWidthSemi.hs:6:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { ZeroWidthSemi.hs:6:3 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr b/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
index 853046201c8aec07296bcbe2294d415d8be95983..5caab76b718ec3cbc510390280a326e2d7e3f6f2 100644
--- a/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
@@ -257,10 +257,11 @@
                (EpaComments
                 []))
               (HsTupleTy
-               (AnnParen
-                AnnParens
-                (EpaSpan { T17544_kw.hs:19:18 })
-                (EpaSpan { T17544_kw.hs:19:19 }))
+               (AnnParens
+                (EpTok
+                 (EpaSpan { T17544_kw.hs:19:18 }))
+                (EpTok
+                 (EpaSpan { T17544_kw.hs:19:19 })))
                (HsBoxedOrConstraintTuple)
                [])))])
           (L
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr b/testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr
index 6f7437117dbf5c57dbe1a7c06a03cfe46637b267..5f816ad6f561e068312615a8b573cbf74f2c5cb5 100644
--- a/testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr
@@ -848,10 +848,9 @@
               (AnnList
                (Just
                 (EpaSpan { T24221.hs:28:12-20 }))
-               (Just
-                (AddEpAnn AnnOpenC (EpaSpan { T24221.hs:28:10 })))
-               (Just
-                (AddEpAnn AnnCloseC (EpaSpan { T24221.hs:29:22 })))
+               (ListBraces
+                (EpTok (EpaSpan { T24221.hs:28:10 }))
+                (EpTok (EpaSpan { T24221.hs:29:22 })))
                []
                (())
                [])
@@ -1057,10 +1056,9 @@
               (AnnList
                (Just
                 (EpaSpan { T24221.hs:33:7-15 }))
-               (Just
-                (AddEpAnn AnnOpenC (EpaSpan { T24221.hs:33:5 })))
-               (Just
-                (AddEpAnn AnnCloseC (EpaSpan { T24221.hs:34:17 })))
+               (ListBraces
+                (EpTok (EpaSpan { T24221.hs:33:5 }))
+                (EpTok (EpaSpan { T24221.hs:34:17 })))
                []
                (())
                [])
@@ -1278,10 +1276,9 @@
               (AnnList
                (Just
                 (EpaSpan { T24221.hs:40:5-13 }))
-               (Just
-                (AddEpAnn AnnOpenC (EpaSpan { T24221.hs:38:10 })))
-               (Just
-                (AddEpAnn AnnCloseC (EpaSpan { T24221.hs:43:3 })))
+               (ListBraces
+                (EpTok (EpaSpan { T24221.hs:38:10 }))
+                (EpTok (EpaSpan { T24221.hs:43:3 })))
                []
                (())
                [])
diff --git a/testsuite/tests/module/mod185.stderr b/testsuite/tests/module/mod185.stderr
index c87a1c93fca5716152c553c3ada6df1fc0cf16b9..352f489d3a490b0a858b24ee0396964135c454e8 100644
--- a/testsuite/tests/module/mod185.stderr
+++ b/testsuite/tests/module/mod185.stderr
@@ -90,8 +90,7 @@
          (EpaSpan { mod185.hs:5:1-24 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -139,7 +138,9 @@
                 (EpaSpan { mod185.hs:5:6-24 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { mod185.hs:5:6 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { mod185.hs:5:6 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/parser/should_compile/DumpParsedAst.stderr b/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
index f8333aed8fafcf09b890a197e716c6db1a8cac66..d2755f2c16492ec48c8b854a4659b21f6c0e0ec2 100644
--- a/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
+++ b/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
@@ -254,10 +254,11 @@
             (EpaComments
              []))
            (HsListTy
-            (AnnParen
-             AnnParensSquare
-             (EpaSpan { DumpParsedAst.hs:9:16 })
-             (EpaSpan { DumpParsedAst.hs:9:18 }))
+            (AnnParensSquare
+             (EpTok
+              (EpaSpan { DumpParsedAst.hs:9:16 }))
+             (EpTok
+              (EpaSpan { DumpParsedAst.hs:9:18 })))
             (L
              (EpAnn
               (EpaSpan { DumpParsedAst.hs:9:17 })
@@ -626,10 +627,11 @@
               (EpaComments
                []))
              (HsListTy
-              (AnnParen
-               AnnParensSquare
-               (EpaSpan { DumpParsedAst.hs:10:27 })
-               (EpaSpan { DumpParsedAst.hs:10:29 }))
+              (AnnParensSquare
+               (EpTok
+                (EpaSpan { DumpParsedAst.hs:10:27 }))
+               (EpTok
+                (EpaSpan { DumpParsedAst.hs:10:29 })))
               (L
                (EpAnn
                 (EpaSpan { DumpParsedAst.hs:10:28 })
@@ -2140,8 +2142,7 @@
          (EpaSpan { DumpParsedAst.hs:25:1-23 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -2189,7 +2190,9 @@
                 (EpaSpan { DumpParsedAst.hs:25:6-23 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpParsedAst.hs:25:6 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpParsedAst.hs:25:6 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/parser/should_compile/DumpParsedAstComments.stderr b/testsuite/tests/parser/should_compile/DumpParsedAstComments.stderr
index 68c4642396ca21356be4eecfe457b3236e49b2c9..cef30f2bbfd8aed56a5c2942769831f555aea3f3 100644
--- a/testsuite/tests/parser/should_compile/DumpParsedAstComments.stderr
+++ b/testsuite/tests/parser/should_compile/DumpParsedAstComments.stderr
@@ -90,8 +90,7 @@
          (EpaSpan { DumpParsedAstComments.hs:9:1-7 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -139,7 +138,9 @@
                 (EpaSpan { DumpParsedAstComments.hs:9:5-7 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpParsedAstComments.hs:9:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpParsedAstComments.hs:9:5 }))))
                 (EpaComments
                  []))
                []
@@ -208,8 +209,7 @@
          (EpaSpan { DumpParsedAstComments.hs:(14,1)-(16,3) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -257,7 +257,9 @@
                 (EpaSpan { DumpParsedAstComments.hs:(14,5)-(16,3) })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpParsedAstComments.hs:14:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpParsedAstComments.hs:14:5 }))))
                 (EpaComments
                  []))
                []
@@ -278,8 +280,7 @@
                  (AnnList
                   (Just
                    (EpaSpan { DumpParsedAstComments.hs:16:3 }))
-                  (Nothing)
-                  (Nothing)
+                  (ListNone)
                   []
                   (EpaSpan { DumpParsedAstComments.hs:14:7-8 })
                   [])
@@ -291,8 +292,7 @@
                    (AnnList
                     (Just
                      (EpaSpan { DumpParsedAstComments.hs:16:3 }))
-                    (Nothing)
-                    (Nothing)
+                    (ListNone)
                     []
                     (NoEpTok)
                     [])
@@ -360,8 +360,7 @@
          (EpaSpan { DumpParsedAstComments.hs:19:1-23 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -409,7 +408,9 @@
                 (EpaSpan { DumpParsedAstComments.hs:19:6-23 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpParsedAstComments.hs:19:6 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpParsedAstComments.hs:19:6 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr b/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
index 041e759bc53cfc3712ccce9c2caa66e8c3f0d2f8..d51f6b58e9b9cb997ef2a1ac678b1a7436059fa3 100644
--- a/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
+++ b/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
@@ -34,8 +34,7 @@
              (EpaSpan { DumpRenamedAst.hs:35:1-23 })
              (AnnList
               (Nothing)
-              (Nothing)
-              (Nothing)
+              (ListNone)
               []
               (NoEpTok)
               [])
@@ -82,7 +81,8 @@
                     (EpaDelta { <no location info> } (SameLine 0) [])
                     (GrhsAnn
                      (Nothing)
-                     (AddEpAnn Annlarrowtail (EpaDelta { <no location info> } (SameLine 0) [])))
+                     (Left
+                      (NoEpTok)))
                     (EpaComments
                      []))
                    []
@@ -548,10 +548,11 @@
                 (EpaComments
                  []))
                (HsListTy
-                (AnnParen
-                 AnnParensSquare
-                 (EpaSpan { DumpRenamedAst.hs:12:27 })
-                 (EpaSpan { DumpRenamedAst.hs:12:29 }))
+                (AnnParensSquare
+                 (EpTok
+                  (EpaSpan { DumpRenamedAst.hs:12:27 }))
+                 (EpTok
+                  (EpaSpan { DumpRenamedAst.hs:12:29 })))
                 (L
                  (EpAnn
                   (EpaSpan { DumpRenamedAst.hs:12:28 })
@@ -646,10 +647,11 @@
               (EpaComments
                []))
              (HsListTy
-              (AnnParen
-               AnnParensSquare
-               (EpaSpan { DumpRenamedAst.hs:11:16 })
-               (EpaSpan { DumpRenamedAst.hs:11:18 }))
+              (AnnParensSquare
+               (EpTok
+                (EpaSpan { DumpRenamedAst.hs:11:16 }))
+               (EpTok
+                (EpaSpan { DumpRenamedAst.hs:11:18 })))
               (L
                (EpAnn
                 (EpaSpan { DumpRenamedAst.hs:11:17 })
@@ -2231,10 +2233,11 @@
                (EpaComments
                 []))
               (HsListTy
-               (AnnParen
-                AnnParensSquare
-                (EpaSpan { DumpRenamedAst.hs:31:12 })
-                (EpaSpan { DumpRenamedAst.hs:31:14 }))
+               (AnnParensSquare
+                (EpTok
+                 (EpaSpan { DumpRenamedAst.hs:31:12 }))
+                (EpTok
+                 (EpaSpan { DumpRenamedAst.hs:31:14 })))
                (L
                 (EpAnn
                  (EpaSpan { DumpRenamedAst.hs:31:13 })
@@ -2292,10 +2295,11 @@
                  (EpaComments
                   []))
                 (HsListTy
-                 (AnnParen
-                  AnnParensSquare
-                  (EpaSpan { DumpRenamedAst.hs:32:10 })
-                  (EpaSpan { DumpRenamedAst.hs:32:12 }))
+                 (AnnParensSquare
+                  (EpTok
+                   (EpaSpan { DumpRenamedAst.hs:32:10 }))
+                  (EpTok
+                   (EpaSpan { DumpRenamedAst.hs:32:12 })))
                  (L
                   (EpAnn
                    (EpaSpan { DumpRenamedAst.hs:32:11 })
@@ -2532,10 +2536,11 @@
          (EpaSpan { DumpRenamedAst.hs:7:18-23 })
          (AnnList
           (Nothing)
-          (Just
-           (AddEpAnn AnnOpenP (EpaSpan { DumpRenamedAst.hs:7:18 })))
-          (Just
-           (AddEpAnn AnnCloseP (EpaSpan { DumpRenamedAst.hs:7:23 })))
+          (ListParens
+           (EpTok
+            (EpaSpan { DumpRenamedAst.hs:7:18 }))
+           (EpTok
+            (EpaSpan { DumpRenamedAst.hs:7:23 })))
           []
           ((,)
            (NoEpTok)
diff --git a/testsuite/tests/parser/should_compile/DumpSemis.stderr b/testsuite/tests/parser/should_compile/DumpSemis.stderr
index 27553bdf784117d1090ada6b724d1aec06ecd662..e2812a4247fa2aefadf9797d5067a056690afb55 100644
--- a/testsuite/tests/parser/should_compile/DumpSemis.stderr
+++ b/testsuite/tests/parser/should_compile/DumpSemis.stderr
@@ -95,10 +95,11 @@
          (EpaSpan { DumpSemis.hs:5:18-19 })
          (AnnList
           (Nothing)
-          (Just
-           (AddEpAnn AnnOpenP (EpaSpan { DumpSemis.hs:5:18 })))
-          (Just
-           (AddEpAnn AnnCloseP (EpaSpan { DumpSemis.hs:5:19 })))
+          (ListParens
+           (EpTok
+            (EpaSpan { DumpSemis.hs:5:18 }))
+           (EpTok
+            (EpaSpan { DumpSemis.hs:5:19 })))
           []
           ((,)
            (NoEpTok)
@@ -222,10 +223,11 @@
              (EpaComments
               []))
             (HsTupleTy
-             (AnnParen
-              AnnParens
-              (EpaSpan { DumpSemis.hs:9:11 })
-              (EpaSpan { DumpSemis.hs:9:12 }))
+             (AnnParens
+              (EpTok
+               (EpaSpan { DumpSemis.hs:9:11 }))
+              (EpTok
+               (EpaSpan { DumpSemis.hs:9:12 })))
              (HsBoxedOrConstraintTuple)
              []))))))))))
   ,(L
@@ -260,8 +262,7 @@
          (EpaSpan { DumpSemis.hs:(10,1)-(12,3) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -309,7 +310,9 @@
                 (EpaSpan { DumpSemis.hs:(10,5)-(12,3) })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:10:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:10:5 }))))
                 (EpaComments
                  []))
                []
@@ -324,8 +327,7 @@
                  (AnnList
                   (Just
                    (EpaSpan { DumpSemis.hs:(11,3)-(12,3) }))
-                  (Nothing)
-                  (Nothing)
+                  (ListNone)
                   []
                   (EpaSpan { DumpSemis.hs:10:7-8 })
                   [])
@@ -337,8 +339,7 @@
                    (AnnList
                     (Just
                      (EpaSpan { DumpSemis.hs:(11,3)-(12,3) }))
-                    (Nothing)
-                    (Nothing)
+                    (ListNone)
                     []
                     (NoEpTok)
                     [])
@@ -364,8 +365,7 @@
                        (AnnList
                         (Just
                          (EpaSpan { DumpSemis.hs:11:6-15 }))
-                        (Nothing)
-                        (Nothing)
+                        (ListNone)
                         []
                         (EpaSpan { DumpSemis.hs:11:3-4 })
                         [])
@@ -377,10 +377,9 @@
                          (AnnList
                           (Just
                            (EpaSpan { DumpSemis.hs:11:8-13 }))
-                          (Just
-                           (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:11:6 })))
-                          (Just
-                           (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:11:15 })))
+                          (ListBraces
+                           (EpTok (EpaSpan { DumpSemis.hs:11:6 }))
+                           (EpTok (EpaSpan { DumpSemis.hs:11:15 })))
                           [(EpTok
                             (EpaSpan { DumpSemis.hs:11:8 }))
                           ,(EpTok
@@ -529,10 +528,11 @@
              (EpaComments
               []))
             (HsTupleTy
-             (AnnParen
-              AnnParens
-              (EpaSpan { DumpSemis.hs:14:11 })
-              (EpaSpan { DumpSemis.hs:14:12 }))
+             (AnnParens
+              (EpTok
+               (EpaSpan { DumpSemis.hs:14:11 }))
+              (EpTok
+               (EpaSpan { DumpSemis.hs:14:12 })))
              (HsBoxedOrConstraintTuple)
              []))))))))))
   ,(L
@@ -569,8 +569,7 @@
          (EpaSpan { DumpSemis.hs:(15,1)-(19,3) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -618,7 +617,9 @@
                 (EpaSpan { DumpSemis.hs:(15,5)-(19,3) })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:15:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:15:5 }))))
                 (EpaComments
                  []))
                []
@@ -633,8 +634,7 @@
                  (AnnList
                   (Just
                    (EpaSpan { DumpSemis.hs:(16,3)-(19,3) }))
-                  (Nothing)
-                  (Nothing)
+                  (ListNone)
                   []
                   (EpaSpan { DumpSemis.hs:15:7-8 })
                   [])
@@ -646,10 +646,9 @@
                    (AnnList
                     (Just
                      (EpaSpan { DumpSemis.hs:(16,5)-(18,5) }))
-                    (Just
-                     (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:16:3 })))
-                    (Just
-                     (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:19:3 })))
+                    (ListBraces
+                     (EpTok (EpaSpan { DumpSemis.hs:16:3 }))
+                     (EpTok (EpaSpan { DumpSemis.hs:19:3 })))
                     [(EpTok
                       (EpaSpan { DumpSemis.hs:16:5 }))
                     ,(EpTok
@@ -795,10 +794,11 @@
              (EpaComments
               []))
             (HsTupleTy
-             (AnnParen
-              AnnParens
-              (EpaSpan { DumpSemis.hs:21:11 })
-              (EpaSpan { DumpSemis.hs:21:12 }))
+             (AnnParens
+              (EpTok
+               (EpaSpan { DumpSemis.hs:21:11 }))
+              (EpTok
+               (EpaSpan { DumpSemis.hs:21:12 })))
              (HsBoxedOrConstraintTuple)
              []))))))))))
   ,(L
@@ -829,8 +829,7 @@
          (EpaSpan { DumpSemis.hs:22:1-30 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -878,7 +877,9 @@
                 (EpaSpan { DumpSemis.hs:22:5-30 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:22:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:22:5 }))))
                 (EpaComments
                  []))
                []
@@ -893,8 +894,7 @@
                  (AnnList
                   (Just
                    (EpaSpan { DumpSemis.hs:22:10-30 }))
-                  (Nothing)
-                  (Nothing)
+                  (ListNone)
                   []
                   (EpaSpan { DumpSemis.hs:22:7-8 })
                   [])
@@ -906,10 +906,9 @@
                    (AnnList
                     (Just
                      (EpaSpan { DumpSemis.hs:22:12-28 }))
-                    (Just
-                     (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:22:10 })))
-                    (Just
-                     (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:22:30 })))
+                    (ListBraces
+                     (EpTok (EpaSpan { DumpSemis.hs:22:10 }))
+                     (EpTok (EpaSpan { DumpSemis.hs:22:30 })))
                     [(EpTok
                       (EpaSpan { DumpSemis.hs:22:12 }))
                     ,(EpTok
@@ -1041,8 +1040,7 @@
          (EpaSpan { DumpSemis.hs:24:1-13 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1090,7 +1088,9 @@
                 (EpaSpan { DumpSemis.hs:24:3-13 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:24:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:24:3 }))))
                 (EpaComments
                  []))
                []
@@ -1141,8 +1141,7 @@
          (EpaSpan { DumpSemis.hs:25:1-13 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1190,7 +1189,9 @@
                 (EpaSpan { DumpSemis.hs:25:3-13 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:25:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:25:3 }))))
                 (EpaComments
                  []))
                []
@@ -1242,8 +1243,7 @@
          (EpaSpan { DumpSemis.hs:26:1-13 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1291,7 +1291,9 @@
                 (EpaSpan { DumpSemis.hs:26:3-13 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:26:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:26:3 }))))
                 (EpaComments
                  []))
                []
@@ -1548,13 +1550,17 @@
              (EpaSpan { DumpSemis.hs:31:6-20 })
              (AnnContext
               (Just
-               ((,)
-                (NormalSyntax)
-                (EpaSpan { DumpSemis.hs:31:22-23 })))
-              [(EpaSpan { DumpSemis.hs:31:6 })
-              ,(EpaSpan { DumpSemis.hs:31:7 })]
-              [(EpaSpan { DumpSemis.hs:31:19 })
-              ,(EpaSpan { DumpSemis.hs:31:20 })])
+               (EpUniTok
+                (EpaSpan { DumpSemis.hs:31:22-23 })
+                (NormalSyntax)))
+              [(EpTok
+                (EpaSpan { DumpSemis.hs:31:6 }))
+              ,(EpTok
+                (EpaSpan { DumpSemis.hs:31:7 }))]
+              [(EpTok
+                (EpaSpan { DumpSemis.hs:31:19 }))
+              ,(EpTok
+                (EpaSpan { DumpSemis.hs:31:20 }))])
              (EpaComments
               []))
             [(L
@@ -1735,8 +1741,7 @@
          (EpaSpan { DumpSemis.hs:32:1-7 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1801,7 +1806,9 @@
                 (EpaSpan { DumpSemis.hs:32:5-7 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:32:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:32:5 }))))
                 (EpaComments
                  []))
                []
@@ -1855,8 +1862,7 @@
          (EpaSpan { DumpSemis.hs:34:8-35 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1904,7 +1910,9 @@
                 (EpaSpan { DumpSemis.hs:34:9-35 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:9 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:34:9 }))))
                 (EpaComments
                  []))
                []
@@ -1927,10 +1935,9 @@
                    (AnnList
                     (Just
                      (EpaSpan { DumpSemis.hs:34:14-30 }))
-                    (Just
-                     (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:34:13 })))
-                    (Just
-                     (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:34:31 })))
+                    (ListBraces
+                     (EpTok (EpaSpan { DumpSemis.hs:34:13 }))
+                     (EpTok (EpaSpan { DumpSemis.hs:34:31 })))
                     [(EpTok
                       (EpaSpan { DumpSemis.hs:34:14 }))
                     ,(EpTok
@@ -1975,8 +1982,7 @@
                          (EpaSpan { DumpSemis.hs:34:19-21 })
                          (AnnList
                           (Nothing)
-                          (Nothing)
-                          (Nothing)
+                          (ListNone)
                           []
                           (NoEpTok)
                           [])
@@ -2024,7 +2030,9 @@
                                 (EpaSpan { DumpSemis.hs:34:20-21 })
                                 (GrhsAnn
                                  (Nothing)
-                                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:20 })))
+                                 (Left
+                                  (EpTok
+                                   (EpaSpan { DumpSemis.hs:34:20 }))))
                                 (EpaComments
                                  []))
                                []
@@ -2078,8 +2086,7 @@
                          (EpaSpan { DumpSemis.hs:34:24-26 })
                          (AnnList
                           (Nothing)
-                          (Nothing)
-                          (Nothing)
+                          (ListNone)
                           []
                           (NoEpTok)
                           [])
@@ -2127,7 +2134,9 @@
                                 (EpaSpan { DumpSemis.hs:34:25-26 })
                                 (GrhsAnn
                                  (Nothing)
-                                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:25 })))
+                                 (Left
+                                  (EpTok
+                                   (EpaSpan { DumpSemis.hs:34:25 }))))
                                 (EpaComments
                                  []))
                                []
@@ -2198,8 +2207,7 @@
          (EpaSpan { DumpSemis.hs:(36,1)-(44,4) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -2264,7 +2272,9 @@
                 (EpaSpan { DumpSemis.hs:(36,7)-(44,4) })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:36:7 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { DumpSemis.hs:36:7 }))))
                 (EpaComments
                  []))
                []
@@ -2305,10 +2315,9 @@
                     (AnnList
                      (Just
                       (EpaSpan { DumpSemis.hs:(38,6)-(43,13) }))
-                     (Just
-                      (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:38:4 })))
-                     (Just
-                      (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:44:4 })))
+                     (ListBraces
+                      (EpTok (EpaSpan { DumpSemis.hs:38:4 }))
+                      (EpTok (EpaSpan { DumpSemis.hs:44:4 })))
                      [(EpTok
                        (EpaSpan { DumpSemis.hs:38:6 }))
                      ,(EpTok
@@ -2370,7 +2379,10 @@
                            (EpaSpan { DumpSemis.hs:39:8-13 })
                            (GrhsAnn
                             (Nothing)
-                            (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:39:8-9 })))
+                            (Right
+                             (EpUniTok
+                              (EpaSpan { DumpSemis.hs:39:8-9 })
+                              (NormalSyntax))))
                            (EpaComments
                             []))
                           []
@@ -2439,7 +2451,10 @@
                            (EpaSpan { DumpSemis.hs:40:8-13 })
                            (GrhsAnn
                             (Nothing)
-                            (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:40:8-9 })))
+                            (Right
+                             (EpUniTok
+                              (EpaSpan { DumpSemis.hs:40:8-9 })
+                              (NormalSyntax))))
                            (EpaComments
                             []))
                           []
@@ -2510,7 +2525,10 @@
                            (EpaSpan { DumpSemis.hs:41:8-13 })
                            (GrhsAnn
                             (Nothing)
-                            (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:41:8-9 })))
+                            (Right
+                             (EpUniTok
+                              (EpaSpan { DumpSemis.hs:41:8-9 })
+                              (NormalSyntax))))
                            (EpaComments
                             []))
                           []
@@ -2583,7 +2601,10 @@
                            (EpaSpan { DumpSemis.hs:42:8-13 })
                            (GrhsAnn
                             (Nothing)
-                            (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:42:8-9 })))
+                            (Right
+                             (EpUniTok
+                              (EpaSpan { DumpSemis.hs:42:8-9 })
+                              (NormalSyntax))))
                            (EpaComments
                             []))
                           []
diff --git a/testsuite/tests/parser/should_compile/DumpTypecheckedAst.stderr b/testsuite/tests/parser/should_compile/DumpTypecheckedAst.stderr
index e393b3f8acdc0f2aab340443277324203c186df8..5be8c8cbb31785ca26371b606910e1e53dc7e034 100644
--- a/testsuite/tests/parser/should_compile/DumpTypecheckedAst.stderr
+++ b/testsuite/tests/parser/should_compile/DumpTypecheckedAst.stderr
@@ -1930,8 +1930,7 @@
           (EpaSpan { DumpTypecheckedAst.hs:20:1-23 })
           (AnnList
            (Nothing)
-           (Nothing)
-           (Nothing)
+           (ListNone)
            []
            (NoEpTok)
            [])
@@ -1978,7 +1977,8 @@
                  (EpaDelta { <no location info> } (SameLine 0) [])
                  (GrhsAnn
                   (Nothing)
-                  (AddEpAnn Annlarrowtail (EpaDelta { <no location info> } (SameLine 0) [])))
+                  (Left
+                   (NoEpTok)))
                  (EpaComments
                   []))
                 []
diff --git a/testsuite/tests/parser/should_compile/KindSigs.stderr b/testsuite/tests/parser/should_compile/KindSigs.stderr
index 8c5fbb2aa8d69c999fbbe96a757c3867d153b4fe..a24398c9ba5ed3587eeca6df03e623c528705ce3 100644
--- a/testsuite/tests/parser/should_compile/KindSigs.stderr
+++ b/testsuite/tests/parser/should_compile/KindSigs.stderr
@@ -312,10 +312,11 @@
         (EpaComments
          []))
        (HsTupleTy
-        (AnnParen
-         AnnParens
-         (EpaSpan { KindSigs.hs:15:14 })
-         (EpaSpan { KindSigs.hs:15:51 }))
+        (AnnParens
+         (EpTok
+          (EpaSpan { KindSigs.hs:15:14 }))
+         (EpTok
+          (EpaSpan { KindSigs.hs:15:51 })))
         (HsBoxedOrConstraintTuple)
         [(L
           (EpAnn
@@ -529,10 +530,11 @@
         (EpaComments
          []))
        (HsTupleTy
-        (AnnParen
-         AnnParensHash
-         (EpaSpan { KindSigs.hs:16:15-16 })
-         (EpaSpan { KindSigs.hs:16:53-54 }))
+        (AnnParensHash
+         (EpTok
+          (EpaSpan { KindSigs.hs:16:15-16 }))
+         (EpTok
+          (EpaSpan { KindSigs.hs:16:53-54 })))
         (HsUnboxedTuple)
         [(L
           (EpAnn
@@ -719,10 +721,11 @@
         (EpaComments
          []))
        (HsListTy
-        (AnnParen
-         AnnParensSquare
-         (EpaSpan { KindSigs.hs:19:12 })
-         (EpaSpan { KindSigs.hs:19:26 }))
+        (AnnParensSquare
+         (EpTok
+          (EpaSpan { KindSigs.hs:19:12 }))
+         (EpTok
+          (EpaSpan { KindSigs.hs:19:26 })))
         (L
          (EpAnn
           (EpaSpan { KindSigs.hs:19:14-24 })
@@ -949,10 +952,11 @@
                    (EpaComments
                     []))
                   (HsTupleTy
-                   (AnnParen
-                    AnnParens
-                    (EpaSpan { KindSigs.hs:22:34 })
-                    (EpaSpan { KindSigs.hs:22:35 }))
+                   (AnnParens
+                    (EpTok
+                     (EpaSpan { KindSigs.hs:22:34 }))
+                    (EpTok
+                     (EpaSpan { KindSigs.hs:22:35 })))
                    (HsBoxedOrConstraintTuple)
                    []))
                  (L
@@ -1001,8 +1005,7 @@
          (EpaSpan { KindSigs.hs:23:1-12 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1067,7 +1070,9 @@
                 (EpaSpan { KindSigs.hs:23:9-12 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { KindSigs.hs:23:9 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { KindSigs.hs:23:9 }))))
                 (EpaComments
                  []))
                []
@@ -1084,9 +1089,11 @@
                   (EpAnn
                    (EpaSpan { KindSigs.hs:23:11-12 })
                    (NameAnnOnly
-                    (NameParens)
-                    (EpaSpan { KindSigs.hs:23:11 })
-                    (EpaSpan { KindSigs.hs:23:12 })
+                    (NameParens
+                     (EpTok
+                      (EpaSpan { KindSigs.hs:23:11 }))
+                     (EpTok
+                      (EpaSpan { KindSigs.hs:23:12 })))
                     [])
                    (EpaComments
                     []))
@@ -1479,10 +1486,11 @@
              (EpaComments
               []))
             (HsListTy
-             (AnnParen
-              AnnParensSquare
-              (EpaSpan { KindSigs.hs:28:34 })
-              (EpaSpan { KindSigs.hs:28:39 }))
+             (AnnParensSquare
+              (EpTok
+               (EpaSpan { KindSigs.hs:28:34 }))
+              (EpTok
+               (EpaSpan { KindSigs.hs:28:39 })))
              (L
               (EpAnn
                (EpaSpan { KindSigs.hs:28:35-38 })
@@ -1727,8 +1735,7 @@
          (EpaSpan { KindSigs.hs:35:1-11 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -1776,7 +1783,9 @@
                 (EpaSpan { KindSigs.hs:35:6-11 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { KindSigs.hs:35:6 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { KindSigs.hs:35:6 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/parser/should_compile/T14189.stderr b/testsuite/tests/parser/should_compile/T14189.stderr
index 7a61b2d3ad04514b419ce91b7e3c1f495806729e..7455dddee632d551c9e7216f79f05ebb8221d8e3 100644
--- a/testsuite/tests/parser/should_compile/T14189.stderr
+++ b/testsuite/tests/parser/should_compile/T14189.stderr
@@ -151,10 +151,9 @@
                 (AnnList
                  (Just
                   (EpaSpan { T14189.hs:6:33-40 }))
-                 (Just
-                  (AddEpAnn AnnOpenC (EpaSpan { T14189.hs:6:31 })))
-                 (Just
-                  (AddEpAnn AnnCloseC (EpaSpan { T14189.hs:6:42 })))
+                 (ListBraces
+                  (EpTok (EpaSpan { T14189.hs:6:31 }))
+                  (EpTok (EpaSpan { T14189.hs:6:42 })))
                  []
                  (())
                  [])
diff --git a/testsuite/tests/parser/should_compile/T15279.stderr b/testsuite/tests/parser/should_compile/T15279.stderr
index 8e7d98a995b3ade6197d3c94409979b5c6995f3b..c3d28abb030e6fb983b222aa7b4726e9cbbc5750 100644
--- a/testsuite/tests/parser/should_compile/T15279.stderr
+++ b/testsuite/tests/parser/should_compile/T15279.stderr
@@ -8,8 +8,12 @@
    (EpAnn
     (EpaSpan { T15279.hs:1:1 })
     (AnnsModule
-     [(AddEpAnn AnnModule (EpaSpan { T15279.hs:3:1-6 }))
-     ,(AddEpAnn AnnWhere (EpaSpan { T15279.hs:3:15-19 }))]
+     (NoEpTok)
+     (EpTok
+      (EpaSpan { T15279.hs:3:1-6 }))
+     (EpTok
+      (EpaSpan { T15279.hs:3:15-19 }))
+     []
      []
      (Just
       ((,)
@@ -18,374 +22,354 @@
     (EpaCommentsBalanced
      []
      []))
-   (VirtualBraces
+   (EpVirtualBraces
     (1))
    (Nothing)
    (Nothing))
   (Just
    (L
-    (SrcSpanAnn (EpAnn
-                 (EpaSpan { T15279.hs:3:8-13 })
-                 (AnnListItem
-                  [])
-                 (EpaComments
-                  [])) { T15279.hs:3:8-13 })
+    (EpAnn
+     (EpaSpan { T15279.hs:3:8-13 })
+     (AnnListItem
+      [])
+     (EpaComments
+      []))
     {ModuleName: T15279}))
   (Nothing)
   []
   [(L
-    (SrcSpanAnn (EpAnn
-                 (EpaSpan { T15279.hs:5:1-19 })
-                 (AnnListItem
-                  [])
-                 (EpaComments
-                  [])) { T15279.hs:5:1-19 })
+    (EpAnn
+     (EpaSpan { T15279.hs:5:1-19 })
+     (AnnListItem
+      [])
+     (EpaComments
+      []))
     (SigD
      (NoExtField)
      (TypeSig
-      (EpAnn
-       (EpaSpan { T15279.hs:5:1-19 })
-       (AnnSig
-        (AddEpAnn AnnDcolon (EpaSpan { T15279.hs:5:5-6 }))
-        [])
-       (EpaComments
-        []))
+      (AnnSig
+       (EpUniTok
+        (EpaSpan { T15279.hs:5:5-6 })
+        (NormalSyntax))
+       (Nothing)
+       (Nothing))
       [(L
-        (SrcSpanAnn (EpAnn
-                     (EpaSpan { T15279.hs:5:1-3 })
-                     (NameAnnTrailing
-                      [])
-                     (EpaComments
-                      [])) { T15279.hs:5:1-3 })
+        (EpAnn
+         (EpaSpan { T15279.hs:5:1-3 })
+         (NameAnnTrailing
+          [])
+         (EpaComments
+          []))
         (Unqual
          {OccName: foo}))]
       (HsWC
        (NoExtField)
        (L
-        (SrcSpanAnn (EpAnn
-                     (EpaSpan { T15279.hs:5:8-19 })
-                     (AnnListItem
-                      [])
-                     (EpaComments
-                      [])) { T15279.hs:5:8-19 })
+        (EpAnn
+         (EpaSpan { T15279.hs:5:8-19 })
+         (AnnListItem
+          [])
+         (EpaComments
+          []))
         (HsSig
          (NoExtField)
          (HsOuterImplicit
           (NoExtField))
          (L
-          (SrcSpanAnn (EpAnn
-                       (EpaSpan { T15279.hs:5:8-19 })
-                       (AnnListItem
-                        [])
-                       (EpaComments
-                        [])) { T15279.hs:5:8-19 })
+          (EpAnn
+           (EpaSpan { T15279.hs:5:8-19 })
+           (AnnListItem
+            [])
+           (EpaComments
+            []))
           (HsFunTy
-           (EpAnn
-            (EpaSpan { T15279.hs:5:8-19 })
-            (NoEpAnns)
-            (EpaComments
-             []))
+           (NoExtField)
            (HsUnrestrictedArrow
-            (L
-             (TokenLoc
-              (EpaSpan { T15279.hs:5:13-14 }))
-             (HsNormalTok)))
+            (EpUniTok
+             (EpaSpan { T15279.hs:5:13-14 })
+             (NormalSyntax)))
            (L
-            (SrcSpanAnn (EpAnn
-                         (EpaSpan { T15279.hs:5:8-11 })
-                         (AnnListItem
-                          [])
-                         (EpaComments
-                          [])) { T15279.hs:5:8-11 })
+            (EpAnn
+             (EpaSpan { T15279.hs:5:8-11 })
+             (AnnListItem
+              [])
+             (EpaComments
+              []))
             (HsTyVar
-             (EpAnn
-              (EpaSpan { T15279.hs:5:8-11 })
-              []
-              (EpaComments
-               []))
+             (NoEpTok)
              (NotPromoted)
              (L
-              (SrcSpanAnn (EpAnn
-                           (EpaSpan { T15279.hs:5:8-11 })
-                           (NameAnnTrailing
-                            [])
-                           (EpaComments
-                            [])) { T15279.hs:5:8-11 })
+              (EpAnn
+               (EpaSpan { T15279.hs:5:8-11 })
+               (NameAnnTrailing
+                [])
+               (EpaComments
+                []))
               (Unqual
                {OccName: Char}))))
            (L
-            (SrcSpanAnn (EpAnn
-                         (EpaSpan { T15279.hs:5:16-19 })
-                         (AnnListItem
-                          [])
-                         (EpaComments
-                          [])) { T15279.hs:5:16-19 })
+            (EpAnn
+             (EpaSpan { T15279.hs:5:16-19 })
+             (AnnListItem
+              [])
+             (EpaComments
+              []))
             (HsTyVar
-             (EpAnn
-              (EpaSpan { T15279.hs:5:16-19 })
-              []
-              (EpaComments
-               []))
+             (NoEpTok)
              (NotPromoted)
              (L
-              (SrcSpanAnn (EpAnn
-                           (EpaSpan { T15279.hs:5:16-19 })
-                           (NameAnnTrailing
-                            [])
-                           (EpaComments
-                            [])) { T15279.hs:5:16-19 })
+              (EpAnn
+               (EpaSpan { T15279.hs:5:16-19 })
+               (NameAnnTrailing
+                [])
+               (EpaComments
+                []))
               (Unqual
                {OccName: Char}))))))))))))
   ,(L
-    (SrcSpanAnn (EpAnn
-                 (EpaSpan { foo:-1:-1 })
-                 (AnnListItem
-                  [])
-                 (EpaComments
-                  [])) { <combineSrcSpans: files differ> })
+    (EpAnn
+     (EpaSpan { <combineSrcSpans: files differ> })
+     (AnnListItem
+      [])
+     (EpaComments
+      []))
     (ValD
      (NoExtField)
      (FunBind
       (NoExtField)
       (L
-       (SrcSpanAnn (EpAnn
-                    (EpaSpan { T15279.hs-incl:1:1-3 })
-                    (NameAnnTrailing
-                     [])
-                    (EpaComments
-                     [])) { T15279.hs-incl:1:1-3 })
+       (EpAnn
+        (EpaSpan { T15279.hs-incl:1:1-3 })
+        (NameAnnTrailing
+         [])
+        (EpaComments
+         []))
        (Unqual
         {OccName: foo}))
       (MG
        (FromSource)
        (L
-        (SrcSpanAnn (EpAnn
-                     (EpaSpan { <combineSrcSpans: files differ> })
-                     (AnnList
-                      (Nothing)
-                      (Nothing)
-                      (Nothing)
-                      []
-                      [])
-                     (EpaComments
-                      [])) { <combineSrcSpans: files differ> })
+        (EpAnn
+         (EpaSpan { <combineSrcSpans: files differ> })
+         (AnnList
+          (Nothing)
+          (ListNone)
+          []
+          (NoEpTok)
+          [])
+         (EpaComments
+          []))
         [(L
-          (SrcSpanAnn (EpAnn
-                       (EpaSpan { T15279.hs-incl:1:1-13 })
-                       (AnnListItem
-                        [])
-                       (EpaComments
-                        [])) { T15279.hs-incl:1:1-13 })
+          (EpAnn
+           (EpaSpan { T15279.hs-incl:1:1-13 })
+           (AnnListItem
+            [])
+           (EpaComments
+            []))
           (Match
-           (EpAnn
-            (EpaSpan { T15279.hs-incl:1:1-13 })
-            []
-            (EpaComments
-             []))
+           (NoExtField)
            (FunRhs
             (L
-             (SrcSpanAnn (EpAnn
-                          (EpaSpan { T15279.hs-incl:1:1-3 })
-                          (NameAnnTrailing
-                           [])
-                          (EpaComments
-                           [])) { T15279.hs-incl:1:1-3 })
+             (EpAnn
+              (EpaSpan { T15279.hs-incl:1:1-3 })
+              (NameAnnTrailing
+               [])
+              (EpaComments
+               []))
              (Unqual
               {OccName: foo}))
             (Prefix)
-            (NoSrcStrict))
-           [(L
-             (SrcSpanAnn (EpAnn
-                          (EpaSpan { T15279.hs-incl:1:5-7 })
-                          (AnnListItem
-                           [])
-                          (EpaComments
-                           [])) { T15279.hs-incl:1:5-7 })
-             (LitPat
-              (NoExtField)
-              (HsChar
-               (SourceText 'a')
-               ('a'))))]
+            (NoSrcStrict)
+            (AnnFunRhs
+             (NoEpTok)
+             []
+             []))
+           (L
+            (EpaSpan { T15279.hs-incl:1:5-7 })
+            [(L
+              (EpAnn
+               (EpaSpan { T15279.hs-incl:1:5-7 })
+               (AnnListItem
+                [])
+               (EpaComments
+                []))
+              (LitPat
+               (NoExtField)
+               (HsChar
+                (SourceText 'a')
+                ('a'))))])
            (GRHSs
             (EpaComments
              [])
             [(L
-              (SrcSpanAnn
-               (EpAnn
-                (EpaSpan { T15279.hs-incl:1:9-13 })
-                (NoEpAnns)
-                (EpaComments
-                 []))
-               { T15279.hs-incl:1:9-13 })
+              (EpAnn
+               (EpaSpan { T15279.hs-incl:1:9-13 })
+               (NoEpAnns)
+               (EpaComments
+                []))
               (GRHS
                (EpAnn
                 (EpaSpan { T15279.hs-incl:1:9-13 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { T15279.hs-incl:1:9 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { T15279.hs-incl:1:9 }))))
                 (EpaComments
                  []))
                []
                (L
-                (SrcSpanAnn (EpAnn
-                             (EpaSpan { T15279.hs-incl:1:11-13 })
-                             (AnnListItem
-                              [])
-                             (EpaComments
-                              [])) { T15279.hs-incl:1:11-13 })
+                (EpAnn
+                 (EpaSpan { T15279.hs-incl:1:11-13 })
+                 (AnnListItem
+                  [])
+                 (EpaComments
+                  []))
                 (HsLit
-                 (EpAnn
-                  (EpaSpan { T15279.hs-incl:1:11-13 })
-                  (NoEpAnns)
-                  (EpaComments
-                   []))
+                 (NoExtField)
                  (HsChar
                   (SourceText 'b')
                   ('b'))))))]
             (EmptyLocalBinds
              (NoExtField)))))
         ,(L
-          (SrcSpanAnn (EpAnn
-                       (EpaSpan { T15279.hs-incl:2:1-13 })
-                       (AnnListItem
-                        [])
-                       (EpaComments
-                        [])) { T15279.hs-incl:2:1-13 })
+          (EpAnn
+           (EpaSpan { T15279.hs-incl:2:1-13 })
+           (AnnListItem
+            [])
+           (EpaComments
+            []))
           (Match
-           (EpAnn
-            (EpaSpan { T15279.hs-incl:2:1-13 })
-            []
-            (EpaComments
-             []))
+           (NoExtField)
            (FunRhs
             (L
-             (SrcSpanAnn (EpAnn
-                          (EpaSpan { T15279.hs-incl:2:1-3 })
-                          (NameAnnTrailing
-                           [])
-                          (EpaComments
-                           [])) { T15279.hs-incl:2:1-3 })
+             (EpAnn
+              (EpaSpan { T15279.hs-incl:2:1-3 })
+              (NameAnnTrailing
+               [])
+              (EpaComments
+               []))
              (Unqual
               {OccName: foo}))
             (Prefix)
-            (NoSrcStrict))
-           [(L
-             (SrcSpanAnn (EpAnn
-                          (EpaSpan { T15279.hs-incl:2:5-7 })
-                          (AnnListItem
-                           [])
-                          (EpaComments
-                           [])) { T15279.hs-incl:2:5-7 })
-             (LitPat
-              (NoExtField)
-              (HsChar
-               (SourceText 'b')
-               ('b'))))]
+            (NoSrcStrict)
+            (AnnFunRhs
+             (NoEpTok)
+             []
+             []))
+           (L
+            (EpaSpan { T15279.hs-incl:2:5-7 })
+            [(L
+              (EpAnn
+               (EpaSpan { T15279.hs-incl:2:5-7 })
+               (AnnListItem
+                [])
+               (EpaComments
+                []))
+              (LitPat
+               (NoExtField)
+               (HsChar
+                (SourceText 'b')
+                ('b'))))])
            (GRHSs
             (EpaComments
              [])
             [(L
-              (SrcSpanAnn
-               (EpAnn
-                (EpaSpan { T15279.hs-incl:2:9-13 })
-                (NoEpAnns)
-                (EpaComments
-                 []))
-               { T15279.hs-incl:2:9-13 })
+              (EpAnn
+               (EpaSpan { T15279.hs-incl:2:9-13 })
+               (NoEpAnns)
+               (EpaComments
+                []))
               (GRHS
                (EpAnn
                 (EpaSpan { T15279.hs-incl:2:9-13 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { T15279.hs-incl:2:9 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { T15279.hs-incl:2:9 }))))
                 (EpaComments
                  []))
                []
                (L
-                (SrcSpanAnn (EpAnn
-                             (EpaSpan { T15279.hs-incl:2:11-13 })
-                             (AnnListItem
-                              [])
-                             (EpaComments
-                              [])) { T15279.hs-incl:2:11-13 })
+                (EpAnn
+                 (EpaSpan { T15279.hs-incl:2:11-13 })
+                 (AnnListItem
+                  [])
+                 (EpaComments
+                  []))
                 (HsLit
-                 (EpAnn
-                  (EpaSpan { T15279.hs-incl:2:11-13 })
-                  (NoEpAnns)
-                  (EpaComments
-                   []))
+                 (NoExtField)
                  (HsChar
                   (SourceText 'c')
                   ('c'))))))]
             (EmptyLocalBinds
              (NoExtField)))))
         ,(L
-          (SrcSpanAnn (EpAnn
-                       (EpaSpan { T15279.hs:7:1-11 })
-                       (AnnListItem
-                        [])
-                       (EpaComments
-                        [])) { T15279.hs:7:1-11 })
+          (EpAnn
+           (EpaSpan { T15279.hs:7:1-11 })
+           (AnnListItem
+            [])
+           (EpaComments
+            []))
           (Match
-           (EpAnn
-            (EpaSpan { T15279.hs:7:1-11 })
-            []
-            (EpaComments
-             []))
+           (NoExtField)
            (FunRhs
             (L
-             (SrcSpanAnn (EpAnn
-                          (EpaSpan { T15279.hs:7:1-3 })
-                          (NameAnnTrailing
-                           [])
-                          (EpaComments
-                           [])) { T15279.hs:7:1-3 })
+             (EpAnn
+              (EpaSpan { T15279.hs:7:1-3 })
+              (NameAnnTrailing
+               [])
+              (EpaComments
+               []))
              (Unqual
               {OccName: foo}))
             (Prefix)
-            (NoSrcStrict))
-           [(L
-             (SrcSpanAnn (EpAnn
-                          (EpaSpan { T15279.hs:7:5 })
-                          (AnnListItem
-                           [])
-                          (EpaComments
-                           [])) { T15279.hs:7:5 })
-             (WildPat
-              (NoExtField)))]
+            (NoSrcStrict)
+            (AnnFunRhs
+             (NoEpTok)
+             []
+             []))
+           (L
+            (EpaSpan { T15279.hs:7:5 })
+            [(L
+              (EpAnn
+               (EpaSpan { T15279.hs:7:5 })
+               (AnnListItem
+                [])
+               (EpaComments
+                []))
+              (WildPat
+               (NoExtField)))])
            (GRHSs
             (EpaComments
              [])
             [(L
-              (SrcSpanAnn
-               (EpAnn
-                (EpaSpan { T15279.hs:7:7-11 })
-                (NoEpAnns)
-                (EpaComments
-                 []))
-               { T15279.hs:7:7-11 })
+              (EpAnn
+               (EpaSpan { T15279.hs:7:7-11 })
+               (NoEpAnns)
+               (EpaComments
+                []))
               (GRHS
                (EpAnn
                 (EpaSpan { T15279.hs:7:7-11 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { T15279.hs:7:7 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { T15279.hs:7:7 }))))
                 (EpaComments
                  []))
                []
                (L
-                (SrcSpanAnn (EpAnn
-                             (EpaSpan { T15279.hs:7:9-11 })
-                             (AnnListItem
-                              [])
-                             (EpaComments
-                              [])) { T15279.hs:7:9-11 })
+                (EpAnn
+                 (EpaSpan { T15279.hs:7:9-11 })
+                 (AnnListItem
+                  [])
+                 (EpaComments
+                  []))
                 (HsLit
-                 (EpAnn
-                  (EpaSpan { T15279.hs:7:9-11 })
-                  (NoEpAnns)
-                  (EpaComments
-                   []))
+                 (NoExtField)
                  (HsChar
                   (SourceText 'a')
                   ('a'))))))]
diff --git a/testsuite/tests/parser/should_compile/T15323.stderr b/testsuite/tests/parser/should_compile/T15323.stderr
index 3ac898e61ef4bc372b70af7fe9e122be9649717b..cb33b73b57cda1ef9331825be80ce48e616e9e18 100644
--- a/testsuite/tests/parser/should_compile/T15323.stderr
+++ b/testsuite/tests/parser/should_compile/T15323.stderr
@@ -182,9 +182,9 @@
               (EpaSpan { T15323.hs:6:31-36 })
               (AnnContext
                (Just
-                ((,)
-                 (NormalSyntax)
-                 (EpaSpan { T15323.hs:6:38-39 })))
+                (EpUniTok
+                 (EpaSpan { T15323.hs:6:38-39 })
+                 (NormalSyntax)))
                []
                [])
               (EpaComments
diff --git a/testsuite/tests/parser/should_compile/T20452.stderr b/testsuite/tests/parser/should_compile/T20452.stderr
index d71610b98aeb3a918252ab519e11e56ecbc6c256..371e76399ecfe3d457170550ab3a6a2b37aaead1 100644
--- a/testsuite/tests/parser/should_compile/T20452.stderr
+++ b/testsuite/tests/parser/should_compile/T20452.stderr
@@ -455,10 +455,11 @@
              (EpaComments
               []))
             (HsListTy
-             (AnnParen
-              AnnParensSquare
-              (EpaSpan { T20452.hs:8:57 })
-              (EpaSpan { T20452.hs:8:74 }))
+             (AnnParensSquare
+              (EpTok
+               (EpaSpan { T20452.hs:8:57 }))
+              (EpTok
+               (EpaSpan { T20452.hs:8:74 })))
              (L
               (EpAnn
                (EpaSpan { T20452.hs:8:58-73 })
@@ -467,10 +468,11 @@
                (EpaComments
                 []))
               (HsTupleTy
-               (AnnParen
-                AnnParens
-                (EpaSpan { T20452.hs:8:58 })
-                (EpaSpan { T20452.hs:8:73 }))
+               (AnnParens
+                (EpTok
+                 (EpaSpan { T20452.hs:8:58 }))
+                (EpTok
+                 (EpaSpan { T20452.hs:8:73 })))
                (HsBoxedOrConstraintTuple)
                [(L
                  (EpAnn
@@ -698,10 +700,11 @@
              (EpaComments
               []))
             (HsListTy
-             (AnnParen
-              AnnParensSquare
-              (EpaSpan { T20452.hs:9:57 })
-              (EpaSpan { T20452.hs:9:74 }))
+             (AnnParensSquare
+              (EpTok
+               (EpaSpan { T20452.hs:9:57 }))
+              (EpTok
+               (EpaSpan { T20452.hs:9:74 })))
              (L
               (EpAnn
                (EpaSpan { T20452.hs:9:58-73 })
@@ -710,10 +713,11 @@
                (EpaComments
                 []))
               (HsTupleTy
-               (AnnParen
-                AnnParens
-                (EpaSpan { T20452.hs:9:58 })
-                (EpaSpan { T20452.hs:9:73 }))
+               (AnnParens
+                (EpTok
+                 (EpaSpan { T20452.hs:9:58 }))
+                (EpTok
+                 (EpaSpan { T20452.hs:9:73 })))
                (HsBoxedOrConstraintTuple)
                [(L
                  (EpAnn
diff --git a/testsuite/tests/parser/should_compile/T20718.stderr b/testsuite/tests/parser/should_compile/T20718.stderr
index 55dcdd7a351af23b1e1bcbce61980543de11879c..5519e9f576cb52180a7fe7e2a584a1a3b2784fb4 100644
--- a/testsuite/tests/parser/should_compile/T20718.stderr
+++ b/testsuite/tests/parser/should_compile/T20718.stderr
@@ -104,8 +104,7 @@
          (EpaSpan { T20718.hs:8:1-5 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -153,7 +152,9 @@
                 (EpaSpan { T20718.hs:8:3-5 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { T20718.hs:8:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { T20718.hs:8:3 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/parser/should_compile/T20846.stderr b/testsuite/tests/parser/should_compile/T20846.stderr
index 73cfa28c85518d9ca45474f6e4410918e07a49e9..db161649fec90790e3d4b4542444188aa8ccaddc 100644
--- a/testsuite/tests/parser/should_compile/T20846.stderr
+++ b/testsuite/tests/parser/should_compile/T20846.stderr
@@ -93,8 +93,7 @@
          (EpaSpan { T20846.hs:4:1-18 })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -114,10 +113,12 @@
              (EpAnn
               (EpaSpan { T20846.hs:4:1-6 })
               (NameAnn
-               (NameParens)
-               (EpaSpan { T20846.hs:4:1 })
+               (NameParens
+                (EpTok
+                 (EpaSpan { T20846.hs:4:1 }))
+                (EpTok
+                 (EpaSpan { T20846.hs:4:6 })))
                (EpaSpan { T20846.hs:4:2-5 })
-               (EpaSpan { T20846.hs:4:6 })
                [])
               (EpaComments
                []))
@@ -146,7 +147,9 @@
                 (EpaSpan { T20846.hs:4:8-18 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { T20846.hs:4:8 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { T20846.hs:4:8 }))))
                 (EpaComments
                  []))
                []
diff --git a/testsuite/tests/parser/should_compile/T23315/T23315.stderr b/testsuite/tests/parser/should_compile/T23315/T23315.stderr
index ed040b8f904d435a5a75e686d9b3d37ae141974e..af261f7c4d60a65803f34019ab66a25800562aeb 100644
--- a/testsuite/tests/parser/should_compile/T23315/T23315.stderr
+++ b/testsuite/tests/parser/should_compile/T23315/T23315.stderr
@@ -101,10 +101,11 @@
            (EpaComments
             []))
           (HsTupleTy
-           (AnnParen
-            AnnParens
-            (EpaSpan { T23315.hsig:3:6 })
-            (EpaSpan { T23315.hsig:3:7 }))
+           (AnnParens
+            (EpTok
+             (EpaSpan { T23315.hsig:3:6 }))
+            (EpTok
+             (EpaSpan { T23315.hsig:3:7 })))
            (HsBoxedOrConstraintTuple)
            []))))))))
   ,(L
diff --git a/testsuite/tests/printer/Test20297.stdout b/testsuite/tests/printer/Test20297.stdout
index 6629e01a58377c9a5b2bd50100ab0d3d27ede00c..d694a6b971d558562adb516973800a6734c37f74 100644
--- a/testsuite/tests/printer/Test20297.stdout
+++ b/testsuite/tests/printer/Test20297.stdout
@@ -70,8 +70,7 @@
          (EpaSpan { Test20297.hs:(5,1)-(7,7) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -119,7 +118,9 @@
                 (EpaSpan { Test20297.hs:5:5-7 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { Test20297.hs:5:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { Test20297.hs:5:5 }))))
                 (EpaComments
                  [(L
                    (EpaSpan
@@ -153,8 +154,7 @@
               (AnnList
                (Just
                 (EpaSpan { <no location info> }))
-               (Nothing)
-               (Nothing)
+               (ListNone)
                []
                (EpTok
                 (EpaSpan { Test20297.hs:7:3-7 }))
@@ -198,8 +198,7 @@
          (EpaSpan { Test20297.hs:(9,1)-(11,26) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -247,7 +246,9 @@
                 (EpaSpan { Test20297.hs:9:5-7 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { Test20297.hs:9:5 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { Test20297.hs:9:5 }))))
                 (EpaComments
                  []))
                []
@@ -275,8 +276,7 @@
               (AnnList
                (Just
                 (EpaSpan { Test20297.hs:11:9-26 }))
-               (Nothing)
-               (Nothing)
+               (ListNone)
                []
                (EpTok
                 (EpaSpan { Test20297.hs:10:3-7 }))
@@ -316,8 +316,7 @@
                     (EpaSpan { Test20297.hs:11:9-26 })
                     (AnnList
                      (Nothing)
-                     (Nothing)
-                     (Nothing)
+                     (ListNone)
                      []
                      (NoEpTok)
                      [])
@@ -365,7 +364,9 @@
                            (EpaSpan { Test20297.hs:11:17-26 })
                            (GrhsAnn
                             (Nothing)
-                            (AddEpAnn AnnEqual (EpaSpan { Test20297.hs:11:17 })))
+                            (Left
+                             (EpTok
+                              (EpaSpan { Test20297.hs:11:17 }))))
                            (EpaComments
                             []))
                           []
@@ -380,8 +381,7 @@
                             (AnnList
                              (Just
                               (EpaSpan { Test20297.hs:11:22-26 }))
-                             (Nothing)
-                             (Nothing)
+                             (ListNone)
                              []
                              (EpaSpan { Test20297.hs:11:19-20 })
                              [])
@@ -393,8 +393,7 @@
                               (AnnList
                                (Just
                                 (EpaSpan { Test20297.hs:11:22-26 }))
-                               (Nothing)
-                               (Nothing)
+                               (ListNone)
                                []
                                (NoEpTok)
                                [])
@@ -506,8 +505,7 @@
          (EpaSpan { Test20297.ppr.hs:(3,1)-(5,7) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -555,7 +553,9 @@
                 (EpaSpan { Test20297.ppr.hs:4:3-5 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { Test20297.ppr.hs:4:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { Test20297.ppr.hs:4:3 }))))
                 (EpaComments
                  []))
                []
@@ -583,8 +583,7 @@
               (AnnList
                (Just
                 (EpaSpan { <no location info> }))
-               (Nothing)
-               (Nothing)
+               (ListNone)
                []
                (EpTok
                 (EpaSpan { Test20297.ppr.hs:5:3-7 }))
@@ -622,8 +621,7 @@
          (EpaSpan { Test20297.ppr.hs:(6,1)-(9,24) })
          (AnnList
           (Nothing)
-          (Nothing)
-          (Nothing)
+          (ListNone)
           []
           (NoEpTok)
           [])
@@ -671,7 +669,9 @@
                 (EpaSpan { Test20297.ppr.hs:7:3-5 })
                 (GrhsAnn
                  (Nothing)
-                 (AddEpAnn AnnEqual (EpaSpan { Test20297.ppr.hs:7:3 })))
+                 (Left
+                  (EpTok
+                   (EpaSpan { Test20297.ppr.hs:7:3 }))))
                 (EpaComments
                  []))
                []
@@ -699,8 +699,7 @@
               (AnnList
                (Just
                 (EpaSpan { Test20297.ppr.hs:9:7-24 }))
-               (Nothing)
-               (Nothing)
+               (ListNone)
                []
                (EpTok
                 (EpaSpan { Test20297.ppr.hs:8:3-7 }))
@@ -734,8 +733,7 @@
                     (EpaSpan { Test20297.ppr.hs:9:7-24 })
                     (AnnList
                      (Nothing)
-                     (Nothing)
-                     (Nothing)
+                     (ListNone)
                      []
                      (NoEpTok)
                      [])
@@ -783,7 +781,9 @@
                            (EpaSpan { Test20297.ppr.hs:9:15-24 })
                            (GrhsAnn
                             (Nothing)
-                            (AddEpAnn AnnEqual (EpaSpan { Test20297.ppr.hs:9:15 })))
+                            (Left
+                             (EpTok
+                              (EpaSpan { Test20297.ppr.hs:9:15 }))))
                            (EpaComments
                             []))
                           []
@@ -798,8 +798,7 @@
                             (AnnList
                              (Just
                               (EpaSpan { Test20297.ppr.hs:9:20-24 }))
-                             (Nothing)
-                             (Nothing)
+                             (ListNone)
                              []
                              (EpaSpan { Test20297.ppr.hs:9:17-18 })
                              [])
@@ -811,8 +810,7 @@
                               (AnnList
                                (Just
                                 (EpaSpan { Test20297.ppr.hs:9:20-24 }))
-                               (Nothing)
-                               (Nothing)
+                               (ListNone)
                                []
                                (NoEpTok)
                                [])
diff --git a/testsuite/tests/printer/Test24533.stdout b/testsuite/tests/printer/Test24533.stdout
index d03fa3686c6566089be2536abc3912397c726f40..a731be9896faf39d76cdeb22213739f52b0950cf 100644
--- a/testsuite/tests/printer/Test24533.stdout
+++ b/testsuite/tests/printer/Test24533.stdout
@@ -89,11 +89,13 @@
              (EpaSpan { Test24533.hs:(5,3)-(7,3) })
              (AnnContext
               (Just
-               ((,)
-                (NormalSyntax)
-                (EpaSpan { Test24533.hs:7:5-6 })))
-              [(EpaSpan { Test24533.hs:5:3 })]
-              [(EpaSpan { Test24533.hs:7:3 })])
+               (EpUniTok
+                (EpaSpan { Test24533.hs:7:5-6 })
+                (NormalSyntax)))
+              [(EpTok
+                (EpaSpan { Test24533.hs:5:3 }))]
+              [(EpTok
+                (EpaSpan { Test24533.hs:7:3 }))])
              (EpaComments
               [(L
                 (EpaSpan
@@ -233,10 +235,11 @@
                (EpaComments
                 []))
               (HsTupleTy
-               (AnnParen
-                AnnParens
-                (EpaSpan { Test24533.hs:8:8 })
-                (EpaSpan { Test24533.hs:8:13 }))
+               (AnnParens
+                (EpTok
+                 (EpaSpan { Test24533.hs:8:8 }))
+                (EpTok
+                 (EpaSpan { Test24533.hs:8:13 })))
                (HsBoxedOrConstraintTuple)
                [(L
                  (EpAnn
@@ -545,8 +548,7 @@
              (EpaSpan { Test24533.hs:16:3-19 })
              (AnnList
               (Nothing)
-              (Nothing)
-              (Nothing)
+              (ListNone)
               []
               (NoEpTok)
               [])
@@ -639,7 +641,9 @@
                     (EpaSpan { Test24533.hs:16:14-19 })
                     (GrhsAnn
                      (Nothing)
-                     (AddEpAnn AnnEqual (EpaSpan { Test24533.hs:16:14 })))
+                     (Left
+                      (EpTok
+                       (EpaSpan { Test24533.hs:16:14 }))))
                     (EpaComments
                      []))
                    []
@@ -760,11 +764,13 @@
              (EpaSpan { Test24533.ppr.hs:3:10-25 })
              (AnnContext
               (Just
-               ((,)
-                (NormalSyntax)
-                (EpaSpan { Test24533.ppr.hs:3:27-28 })))
-              [(EpaSpan { Test24533.ppr.hs:3:10 })]
-              [(EpaSpan { Test24533.ppr.hs:3:25 })])
+               (EpUniTok
+                (EpaSpan { Test24533.ppr.hs:3:27-28 })
+                (NormalSyntax)))
+              [(EpTok
+                (EpaSpan { Test24533.ppr.hs:3:10 }))]
+              [(EpTok
+                (EpaSpan { Test24533.ppr.hs:3:25 }))])
              (EpaComments
               []))
             [(L
@@ -898,10 +904,11 @@
                (EpaComments
                 []))
               (HsTupleTy
-               (AnnParen
-                AnnParens
-                (EpaSpan { Test24533.ppr.hs:3:35 })
-                (EpaSpan { Test24533.ppr.hs:3:40 }))
+               (AnnParens
+                (EpTok
+                 (EpaSpan { Test24533.ppr.hs:3:35 }))
+                (EpTok
+                 (EpaSpan { Test24533.ppr.hs:3:40 })))
                (HsBoxedOrConstraintTuple)
                [(L
                  (EpAnn
@@ -1143,8 +1150,7 @@
              (EpaSpan { Test24533.ppr.hs:6:3-19 })
              (AnnList
               (Nothing)
-              (Nothing)
-              (Nothing)
+              (ListNone)
               []
               (NoEpTok)
               [])
@@ -1237,7 +1243,9 @@
                     (EpaSpan { Test24533.ppr.hs:6:14-19 })
                     (GrhsAnn
                      (Nothing)
-                     (AddEpAnn AnnEqual (EpaSpan { Test24533.ppr.hs:6:14 })))
+                     (Left
+                      (EpTok
+                       (EpaSpan { Test24533.ppr.hs:6:14 }))))
                     (EpaComments
                      []))
                    []
diff --git a/utils/check-exact/ExactPrint.hs b/utils/check-exact/ExactPrint.hs
index 0de1b307b327017348ed818e13ba876d6547755e..992d19ba8d9ef3da2c54d5817912eb2cbb8a5313 100644
--- a/utils/check-exact/ExactPrint.hs
+++ b/utils/check-exact/ExactPrint.hs
@@ -264,14 +264,6 @@ instance HasTrailing EpaLocation where
   trailing _ = []
   setTrailing a _ = a
 
-instance HasTrailing AddEpAnn where
-  trailing _ = []
-  setTrailing a _ = a
-
-instance HasTrailing (AddEpAnn, AddEpAnn) where
-  trailing _ = []
-  setTrailing a _ = a
-
 instance HasTrailing EpAnnSumPat where
   trailing _ = []
   setTrailing a _ = a
@@ -291,12 +283,12 @@ instance HasTrailing AnnPragma where
 instance HasTrailing AnnContext where
   trailing (AnnContext ma _opens _closes)
     = case ma of
-      Just (UnicodeSyntax, r) -> [AddDarrowUAnn r]
-      Just (NormalSyntax,  r) -> [AddDarrowAnn r]
-      Nothing -> []
+      Just (EpUniTok r UnicodeSyntax) -> [AddDarrowUAnn r]
+      Just (EpUniTok r NormalSyntax)  -> [AddDarrowAnn r]
+      _ -> []
 
-  setTrailing a [AddDarrowUAnn r] = a {ac_darrow = Just (UnicodeSyntax, r)}
-  setTrailing a [AddDarrowAnn r] = a{ac_darrow = Just (NormalSyntax, r)}
+  setTrailing a [AddDarrowUAnn r] = a {ac_darrow = Just (EpUniTok r UnicodeSyntax)}
+  setTrailing a [AddDarrowAnn r] = a{ac_darrow = Just (EpUniTok r NormalSyntax)}
   setTrailing a [] = a{ac_darrow = Nothing}
   setTrailing a ts = error $ "Cannot setTrailing " ++ showAst ts ++ " for " ++ showAst a
 
@@ -776,33 +768,51 @@ markExternalSourceTextE l (SourceText txt) _ = printStringAtAA l (unpackFS txt)
 
 -- ---------------------------------------------------------------------
 
-markLensMAA :: (Monad m, Monoid w)
-  => EpAnn a -> Lens a (Maybe AddEpAnn) -> EP w m (EpAnn a)
-markLensMAA epann l = markLensMAA' epann (lepa . l)
+markLensBracketsO :: (Monad m, Monoid w)
+  => EpAnn a -> Lens a AnnListBrackets -> EP w m (EpAnn a)
+markLensBracketsO epann l = markLensBracketsO' epann (lepa . l)
 
-markLensMAA' :: (Monad m, Monoid w)
-  => a -> Lens a (Maybe AddEpAnn) -> EP w m a
-markLensMAA' a l =
+markLensBracketsO' :: (Monad m, Monoid w)
+  => a -> Lens a AnnListBrackets -> EP w m a
+markLensBracketsO' a l =
   case view l a of
-    Nothing -> return a
-    Just aa -> do
-      aa' <- markAddEpAnn aa
-      return (set l (Just aa') a)
-
+    ListParens o c -> do
+      o' <- markEpToken o
+      return (set l (ListParens o' c) a)
+    ListBraces o c -> do
+      o' <- markEpToken o
+      return (set l (ListBraces o' c) a)
+    ListSquare o c -> do
+      o' <- markEpToken o
+      return (set l (ListSquare o' c) a)
+    ListBanana o c -> do
+      o' <- markEpUniToken o
+      return (set l (ListBanana o' c) a)
+    ListNone -> return (set l ListNone a)
+
+markLensBracketsC :: (Monad m, Monoid w)
+  => EpAnn a -> Lens a AnnListBrackets -> EP w m (EpAnn a)
+markLensBracketsC epann l = markLensBracketsC' epann (lepa . l)
+
+markLensBracketsC' :: (Monad m, Monoid w)
+  => a -> Lens a AnnListBrackets -> EP w m a
+markLensBracketsC' a l =
+  case view l a of
+    ListParens o c -> do
+      c' <- markEpToken c
+      return (set l (ListParens o c') a)
+    ListBraces o c -> do
+      c' <- markEpToken c
+      return (set l (ListBraces o c') a)
+    ListSquare o c -> do
+      c' <- markEpToken c
+      return (set l (ListSquare o c') a)
+    ListBanana o c -> do
+      c' <- markEpUniToken c
+      return (set l (ListBanana o c') a)
+    ListNone -> return (set l ListNone a)
 -- -------------------------------------
 
-markLensAA :: (Monad m, Monoid w)
-  => EpAnn a -> Lens a AddEpAnn -> EP w m (EpAnn a)
-markLensAA epann l = markLensAA' epann (lepa . l)
-
-markLensAA' :: (Monad m, Monoid w)
-  => a -> Lens a AddEpAnn -> EP w m a
-markLensAA' a l = do
-  a' <- markKw (view l a)
-  return (set l a' a)
-
--- ---------------------------------------------------------------------
-
 -- markEpTokenM :: forall m w tok . (Monad m, Monoid w, KnownSymbol tok)
 --   => Maybe (EpToken tok) -> EP w m (Maybe (EpToken tok))
 
@@ -864,27 +874,32 @@ markAnnOpen'' el NoSourceText txt   = printStringAtAA el txt
 markAnnOpen'' el (SourceText txt) _ = printStringAtAA el $ unpackFS txt
 
 -- ---------------------------------------------------------------------
-{-
-data AnnParen
-  = AnnParen {
-      ap_adornment :: ParenType,
-      ap_open      :: EpaLocation,
-      ap_close     :: EpaLocation
-      } deriving (Data)
--}
+
 markOpeningParen, markClosingParen :: (Monad m, Monoid w) => AnnParen -> EP w m AnnParen
-markOpeningParen an = markParen an lfst
-markClosingParen an = markParen an lsnd
-
-markParen :: (Monad m, Monoid w) => AnnParen -> (forall a. Lens (a,a) a) -> EP w m AnnParen
-markParen (AnnParen pt o c) l = do
-  loc' <- markKwA (view l $ kw pt) (view l (o, c))
-  let (o',c') = set l loc' (o,c)
-  return (AnnParen pt o' c')
-  where
-    kw AnnParens       = (AnnOpenP,  AnnCloseP)
-    kw AnnParensHash   = (AnnOpenPH, AnnClosePH)
-    kw AnnParensSquare = (AnnOpenS, AnnCloseS)
+markOpeningParen an = markParenO an
+markClosingParen an = markParenC an
+
+markParenO :: (Monad m, Monoid w) => AnnParen -> EP w m AnnParen
+markParenO (AnnParens o c) = do
+  o' <- markEpToken o
+  return (AnnParens o' c)
+markParenO (AnnParensHash o c) = do
+  o' <- markEpToken o
+  return (AnnParensHash o' c)
+markParenO (AnnParensSquare o c) = do
+  o' <- markEpToken o
+  return (AnnParensSquare o' c)
+
+markParenC :: (Monad m, Monoid w) => AnnParen -> EP w m AnnParen
+markParenC (AnnParens o c) = do
+  c' <- markEpToken c
+  return (AnnParens o c')
+markParenC (AnnParensHash o c) = do
+  c' <- markEpToken c
+  return (AnnParensHash o c')
+markParenC (AnnParensSquare o c) = do
+  c' <- markEpToken c
+  return (AnnParensSquare o c')
 
 -- ---------------------------------------------------------------------
 -- Bare bones Optics
@@ -990,8 +1005,7 @@ limportDeclAnnPackage k annImp = fmap (\new -> annImp { importDeclAnnPackage = n
 -- data AnnList
 --   = AnnList {
 --       al_anchor    :: Maybe Anchor, -- ^ start point of a list having layout
---       al_open      :: Maybe AddEpAnn,
---       al_close     :: Maybe AddEpAnn,
+--       al_brackets  :: !AnnListBrackets,
 --       al_semis     :: [EpToken ";"], -- decls
 --       al_rest      :: !a,
 --       al_trailing  :: [TrailingAnn] -- ^ items appearing after the
@@ -999,13 +1013,9 @@ limportDeclAnnPackage k annImp = fmap (\new -> annImp { importDeclAnnPackage = n
 --                                     -- context
 --       } deriving (Data,Eq)
 
-lal_open :: Lens (AnnList l) (Maybe AddEpAnn)
-lal_open k parent = fmap (\new -> parent { al_open = new })
-                           (k (al_open parent))
-
-lal_close :: Lens (AnnList l) (Maybe AddEpAnn)
-lal_close k parent = fmap (\new -> parent { al_close = new })
-                           (k (al_close parent))
+lal_brackets :: Lens (AnnList l) AnnListBrackets
+lal_brackets k parent = fmap (\new -> parent { al_brackets = new })
+                           (k (al_brackets parent))
 
 lal_semis :: Lens (AnnList l) [EpToken ";"]
 lal_semis k parent = fmap (\new -> parent { al_semis = new })
@@ -1015,10 +1025,6 @@ lal_rest :: Lens (AnnList l) l
 lal_rest k parent = fmap (\new -> parent { al_rest = new })
                            (k (al_rest parent))
 
--- lal_trailing :: Lens AnnList [TrailingAnn]
--- lal_trailing k parent = fmap (\new -> parent { al_trailing = new })
---                            (k (al_trailing parent))
-
 -- -------------------------------------
 
 lid :: Lens a a
@@ -1201,15 +1207,15 @@ lra_rest k parent = fmap (\new -> parent { ra_rest = new })
 -- ---------------------------------------------------------------------
 -- data GrhsAnn
 --   = GrhsAnn {
---       ga_vbar :: Maybe EpaLocation, -- TODO:AZ do we need this?
---       ga_sep  :: AddEpAnn -- ^ Match separator location
+--       ga_vbar :: Maybe (EpToken "|"),
+--       ga_sep  :: Either (EpToken "=") TokRarrow -- ^ Match separator location, `=` or `->`
 --       } deriving (Data)
 
-lga_vbar :: Lens GrhsAnn (Maybe EpaLocation)
+lga_vbar :: Lens GrhsAnn (Maybe (EpToken "|"))
 lga_vbar k parent = fmap (\new -> parent { ga_vbar = new })
                                 (k (ga_vbar parent))
 
-lga_sep :: Lens GrhsAnn AddEpAnn
+lga_sep :: Lens GrhsAnn (Either (EpToken "=") TokRarrow)
 lga_sep k parent = fmap (\new -> parent { ga_sep = new })
                                 (k (ga_sep parent))
 
@@ -1322,43 +1328,6 @@ markEpaLocationAll :: (Monad m, Monoid w)
   => [EpaLocation] -> String -> EP w m [EpaLocation]
 markEpaLocationAll locs str = mapM (\l -> printStringAtAA l str) locs
 
-markAddEpAnn :: (Monad m, Monoid w) => AddEpAnn -> EP w m AddEpAnn
-markAddEpAnn a@(AddEpAnn kw _) = do
-  r <- mark [a] kw
-  case r of
-    [a'] -> return a'
-    _ -> error "Should not happen: markAddEpAnn"
-
-mark :: (Monad m, Monoid w) => [AddEpAnn] -> AnnKeywordId -> EP w m [AddEpAnn]
-mark anns kw = do
-  case find' kw anns of
-    (lead, Just aa, end) -> do
-      aa' <- markKw aa
-      return (lead ++ [aa'] ++ end)
-    (_lead, Nothing, _end) -> case find' (unicodeAnn kw) anns of
-      (leadu, Just aau, endu) -> do
-        aau' <- markKw aau
-        return (leadu ++ [aau'] ++ endu)
-      (_,Nothing,_) -> return anns
-
--- | Find for update, returning lead section of the list, item if
--- found, and tail of the list
-find' :: AnnKeywordId -> [AddEpAnn] -> ([AddEpAnn], Maybe AddEpAnn, [AddEpAnn])
-find' kw anns = (lead, middle, end)
-  where
-    (lead, rest) = break (\(AddEpAnn k _) -> k == kw) anns
-    (middle,end) = case rest of
-      [] -> (Nothing, [])
-      (x:xs) -> (Just x, xs)
-
-markKw :: (Monad m, Monoid w) => AddEpAnn -> EP w m AddEpAnn
-markKw an = markKwC CaptureComments an
-
-markKwC :: (Monad m, Monoid w) => CaptureComments -> AddEpAnn -> EP w m AddEpAnn
-markKwC capture (AddEpAnn kw ss) = do
-  ss' <- markKwAC capture kw ss
-  return (AddEpAnn kw ss')
-
 -- | This should be the main driver of the process, managing printing keywords.
 -- It returns the 'EpaDelta' variant of the passed in 'EpaLocation'
 markKwA :: (Monad m, Monoid w) => AnnKeywordId -> EpaLocation -> EP w m EpaLocation
@@ -1397,10 +1366,10 @@ markAnnListA :: (Monad m, Monoid w)
   -> (EpAnn (AnnList l) -> EP w m (EpAnn (AnnList l), a))
   -> EP w m (EpAnn (AnnList l), a)
 markAnnListA an action = do
-  an0 <- markLensMAA an lal_open
+  an0 <- markLensBracketsO an lal_brackets
   an1 <- markEpAnnAllLT an0 lal_semis
   (an2, r) <- action an1
-  an3 <- markLensMAA an2 lal_close
+  an3 <- markLensBracketsC an2 lal_brackets
   return (an3, r)
 
 markAnnListA' :: (Monad m, Monoid w)
@@ -1408,10 +1377,10 @@ markAnnListA' :: (Monad m, Monoid w)
   -> (AnnList l -> EP w m (AnnList l, a))
   -> EP w m (AnnList l , a)
 markAnnListA' an action = do
-  an0 <- markLensMAA' an lal_open
+  an0 <- markLensBracketsO' an lal_brackets
   an1 <- markEpAnnAllLT' an0 lal_semis
   (an2, r) <- action an1
-  an3 <- markLensMAA' an2 lal_close
+  an3 <- markLensBracketsC' an2 lal_brackets
   return (an3, r)
 
 -- ---------------------------------------------------------------------
@@ -2906,9 +2875,12 @@ instance ExactPrint (GRHS GhcPs (LocatedA (HsExpr GhcPs))) where
   exact (GRHS an guards expr) = do
     an0 <- if null guards
              then return an
-             else markLensKwM an lga_vbar AnnVbar
+             else markLensFun' an lga_vbar (\mt -> mapM markEpToken mt)
     guards' <- markAnnotated guards
-    an1 <- markLensAA an0 lga_sep -- Mark the matchSeparator for these GRHSs
+    -- Mark the matchSeparator for these GRHSs
+    an1 <- markLensFun' an0 lga_sep (\s -> case s of
+                                       Left  tok -> Left  <$> markEpToken tok
+                                       Right tok -> Right <$> markEpUniToken tok)
     expr' <- markAnnotated expr
     return (GRHS an1 guards' expr')
 
@@ -2917,9 +2889,12 @@ instance ExactPrint (GRHS GhcPs (LocatedA (HsCmd GhcPs))) where
   setAnnotationAnchor (GRHS an a b) anc ts cs = GRHS (setAnchorEpa an anc ts cs) a b
 
   exact (GRHS an guards expr) = do
-    an0 <- markLensKwM an lga_vbar AnnVbar
+    an0 <- markLensFun' an lga_vbar (\mt -> mapM markEpToken mt)
     guards' <- markAnnotated guards
-    an1 <- markLensAA an0 lga_sep -- Mark the matchSeparator for these GRHSs
+    -- Mark the matchSeparator for these GRHSs
+    an1 <- markLensFun' an0 lga_sep (\s -> case s of
+                                       Left  tok -> Left  <$> markEpToken tok
+                                       Right tok -> Right <$> markEpUniToken tok)
     expr' <- markAnnotated expr
     return (GRHS an1 guards' expr')
 
@@ -3079,9 +3054,9 @@ instance ExactPrint (HsExpr GhcPs) where
 
   exact (ExplicitList an es) = do
     debugM $ "ExplicitList start"
-    an0 <- markLensMAA' an lal_open
+    an0 <- markLensBracketsO' an lal_brackets
     es' <- markAnnotated es
-    an1 <- markLensMAA' an0 lal_close
+    an1 <- markLensBracketsC' an0 lal_brackets
     debugM $ "ExplicitList end"
     return (ExplicitList an1 es')
   exact (RecordCon (open, close) con_id binds) = do
@@ -3475,7 +3450,7 @@ instance ExactPrint (HsCmd GhcPs) where
     return (HsCmdArrApp (isU, l') arr' arg' HsHigherOrderApp False)
 
   exact (HsCmdArrForm an e fixity cs) = do
-    an0 <- markLensMAA' an lal_open
+    an0 <- markLensBracketsO' an lal_brackets
     (e',cs') <- case (fixity, cs) of
       (Infix, (arg1:argrest)) -> do
         arg1' <- markAnnotated arg1
@@ -3487,7 +3462,7 @@ instance ExactPrint (HsCmd GhcPs) where
         cs' <- markAnnotated cs
         return (e', cs')
       (Infix, []) -> error "Not possible"
-    an1 <- markLensMAA' an0 lal_close
+    an1 <- markLensBracketsC' an0 lal_brackets
     return (HsCmdArrForm an1 e' fixity cs')
 
   exact (HsCmdApp an e1 e2) = do
@@ -3650,7 +3625,7 @@ instance ExactPrint (TyClDecl GhcPs) where
     epTokensToComments AnnCloseP cps
     t' <- markEpToken t
 
-    (_anx, ltycon', tyvars',_,_) <- exactVanillaDeclHead ltycon tyvars fixity Nothing
+    (_,ltycon', tyvars',_,_) <- exactVanillaDeclHead ltycon tyvars fixity Nothing
     eq' <- markEpToken eq
     rhs' <- markAnnotated rhs
     return (SynDecl { tcdSExt = AnnSynDecl [] [] t' eq'
@@ -3659,7 +3634,7 @@ instance ExactPrint (TyClDecl GhcPs) where
 
   exact (DataDecl { tcdDExt = x, tcdLName = ltycon, tcdTyVars = tyvars
                   , tcdFixity = fixity, tcdDataDefn = defn }) = do
-    (_, ltycon', tyvars', _, defn') <-
+    (_,ltycon', tyvars', _, defn') <-
       exactDataDefn (exactVanillaDeclHead ltycon tyvars fixity) defn
     return (DataDecl { tcdDExt = x, tcdLName = ltycon', tcdTyVars = tyvars'
                      , tcdFixity = fixity, tcdDataDefn = defn' })
@@ -3717,7 +3692,7 @@ instance ExactPrint (TyClDecl GhcPs) where
           epTokensToComments AnnOpenP ops
           epTokensToComments AnnCloseP cps
           c' <- markEpToken c
-          (_, lclas', tyvars',_,context') <-  exactVanillaDeclHead lclas tyvars fixity context
+          (_,lclas', tyvars',_,context') <- exactVanillaDeclHead lclas tyvars fixity context
           (vb', fds') <- if (null fds)
             then return (vb, fds)
             else do
@@ -3759,7 +3734,7 @@ instance ExactPrint (FamilyDecl GhcPs) where
 
     epTokensToComments AnnOpenP ops
     epTokensToComments AnnCloseP cps
-    (_, ltycon', tyvars',_,_) <- exactVanillaDeclHead ltycon tyvars fixity Nothing
+    (_,ltycon', tyvars',_,_) <- exactVanillaDeclHead ltycon tyvars fixity Nothing
     (dc', eq', result') <- exact_kind (dc, eq)
     (vb', mb_inj') <-
       case mb_inj of
@@ -3888,7 +3863,7 @@ exactVanillaDeclHead :: (Monad m, Monoid w)
                      -> LHsQTyVars GhcPs
                      -> LexicalFixity
                      -> Maybe (LHsContext GhcPs)
-                     -> EP w m ( [AddEpAnn]
+                     -> EP w m ( () -- TO allow use in exactDataDefn
                                , LocatedN RdrName
                                , LHsQTyVars GhcPs
                                , (), Maybe (LHsContext GhcPs))
@@ -3916,7 +3891,7 @@ exactVanillaDeclHead thing tvs@(HsQTvs { hsq_explicit = tyvars }) fixity context
       return (thing', [])
   context' <- mapM markAnnotated context
   (thing', tyvars') <- exact_tyvars tyvars
-  return (noAnn, thing', tvs { hsq_explicit = tyvars' }, (), context')
+  return ((), thing', tvs { hsq_explicit = tyvars' }, (), context')
 
 -- ---------------------------------------------------------------------
 
@@ -4188,9 +4163,9 @@ instance (ExactPrint a) => ExactPrint (LocatedC a) where
   setAnnotationAnchor = setAnchorAn
 
   exact (L (EpAnn anc (AnnContext ma opens closes) cs) a) = do
-    opens' <- mapM (markKwA AnnOpenP) opens
+    opens' <- mapM markEpToken opens
     a' <- markAnnotated a
-    closes' <- mapM (markKwA AnnCloseP) closes
+    closes' <- mapM markEpToken closes
     return (L (EpAnn anc (AnnContext ma opens' closes') cs) a')
 
 -- ---------------------------------------------------------------------
@@ -4226,46 +4201,33 @@ instance ExactPrint (LocatedN RdrName) where
   exact (L (EpAnn anc ann cs) n) = do
     ann' <-
       case ann of
-        NameAnn a o l c t -> do
-          mn <- markName a o (Just (l,n)) c
+        NameAnn a l t -> do
+          mn <- markName a (Just (l,n))
           case mn of
-            (o', (Just (l',_n)), c') -> do
-              return (NameAnn a o' l' c' t)
+            (a', (Just (l',_n))) -> do
+              return (NameAnn a' l' t)
             _ -> error "ExactPrint (LocatedN RdrName)"
-        NameAnnCommas a o commas c t -> do
-          let (kwo,kwc) = adornments a
-          (AddEpAnn _ o') <- markKwC NoCaptureComments (AddEpAnn kwo o)
-          commas' <- forM commas (\loc -> locFromAdd <$> markKwC NoCaptureComments (AddEpAnn AnnComma loc))
-          (AddEpAnn _ c') <- markKwC NoCaptureComments (AddEpAnn kwc c)
-          return (NameAnnCommas a o' commas' c' t)
-        NameAnnBars a o bars c t -> do
-          let (kwo,kwc) = adornments a
-          (AddEpAnn _ o') <- markKwC NoCaptureComments (AddEpAnn kwo o)
-          bars' <- forM bars (\loc -> locFromAdd <$> markKwC NoCaptureComments (AddEpAnn AnnVbar loc))
-          (AddEpAnn _ c') <- markKwC NoCaptureComments (AddEpAnn kwc c)
-          return (NameAnnBars a o' bars' c' t)
-        NameAnnOnly a o c t -> do
-          (o',_,c') <- markName a o Nothing c
-          return (NameAnnOnly a o' c' t)
-        NameAnnRArrow unicode o nl c t -> do
-          o' <- case o of
-            Just o0 -> do
-              (AddEpAnn _ o') <- markKwC NoCaptureComments (AddEpAnn AnnOpenP o0)
-              return (Just o')
-            Nothing -> return Nothing
-          (AddEpAnn _ nl') <-
-            if unicode
-              then markKwC NoCaptureComments (AddEpAnn AnnRarrowU nl)
-              else markKwC NoCaptureComments (AddEpAnn AnnRarrow nl)
-          c' <- case c of
-            Just c0 -> do
-              (AddEpAnn _ c') <- markKwC NoCaptureComments (AddEpAnn AnnCloseP c0)
-              return (Just c')
-            Nothing -> return Nothing
-          return (NameAnnRArrow unicode o' nl' c' t)
+        NameAnnCommas a commas t -> do
+          a0 <- markNameAdornmentO a
+          commas' <- forM commas (\loc -> printStringAtAAC NoCaptureComments loc ",")
+          a1 <- markNameAdornmentC a0
+          return (NameAnnCommas a1 commas' t)
+        NameAnnBars (o,c) bars t -> do
+          o' <- markEpToken o
+          bars' <- forM bars (\loc -> printStringAtAAC NoCaptureComments loc "|")
+          c' <- markEpToken c
+          return (NameAnnBars (o',c') bars' t)
+        NameAnnOnly a t -> do
+          (a',_) <- markName a Nothing
+          return (NameAnnOnly a' t)
+        NameAnnRArrow o nl c t -> do
+          o' <- mapM markEpToken o
+          nl' <- markEpUniToken nl
+          c' <- mapM markEpToken c
+          return (NameAnnRArrow o' nl' c' t)
         NameAnnQuote q name t -> do
           debugM $ "NameAnnQuote"
-          (AddEpAnn _ q') <- markKwC NoCaptureComments (AddEpAnn AnnSimpleQuote q)
+          q' <- markEpToken q
           (L name' _) <- markAnnotated (L name n)
           return (NameAnnQuote q' name' t)
         NameAnnTrailing t -> do
@@ -4273,8 +4235,36 @@ instance ExactPrint (LocatedN RdrName) where
           return (NameAnnTrailing t)
     return (L (EpAnn anc ann' cs) n)
 
-locFromAdd :: AddEpAnn -> EpaLocation
-locFromAdd (AddEpAnn _ loc) = loc
+
+markNameAdornmentO :: (Monad m, Monoid w) => NameAdornment -> EP w m NameAdornment
+markNameAdornmentO (NameParens o c) = do
+  o' <- markEpToken o
+  return (NameParens o' c)
+markNameAdornmentO (NameParensHash o c) = do
+  o' <- markEpToken o
+  return (NameParensHash o' c)
+markNameAdornmentO (NameBackquotes o c) = do
+  o' <- markEpToken o
+  return (NameBackquotes o' c)
+markNameAdornmentO (NameSquare o c) = do
+  o' <- markEpToken o
+  return (NameSquare o' c)
+markNameAdornmentO NameNoAdornment      = return NameNoAdornment
+
+markNameAdornmentC :: (Monad m, Monoid w) => NameAdornment -> EP w m NameAdornment
+markNameAdornmentC (NameParens o c) = do
+  c' <- markEpToken c
+  return (NameParens o c')
+markNameAdornmentC (NameParensHash o c) = do
+  c' <- markEpToken c
+  return (NameParensHash o c')
+markNameAdornmentC (NameBackquotes o c) = do
+  c' <- markEpToken c
+  return (NameBackquotes o c')
+markNameAdornmentC (NameSquare o c) = do
+  c' <- markEpToken c
+  return (NameSquare o c')
+markNameAdornmentC NameNoAdornment      = return NameNoAdornment
 
 printUnicode :: (Monad m, Monoid w) => EpaLocation -> RdrName -> EP w m EpaLocation
 printUnicode anc n = do
@@ -4290,25 +4280,18 @@ printUnicode anc n = do
 
 
 markName :: (Monad m, Monoid w)
-  => NameAdornment -> EpaLocation -> Maybe (EpaLocation,RdrName) -> EpaLocation
-  -> EP w m (EpaLocation, Maybe (EpaLocation,RdrName), EpaLocation)
-markName adorn open mname close = do
-  let (kwo,kwc) = adornments adorn
-  (AddEpAnn _ open') <- markKwC CaptureComments (AddEpAnn kwo open)
+  => NameAdornment -> Maybe (EpaLocation,RdrName)
+  -> EP w m (NameAdornment, Maybe (EpaLocation,RdrName))
+markName adorn mname = do
+  adorn0 <- markNameAdornmentO adorn
   mname' <-
     case mname of
       Nothing -> return Nothing
       Just (name, a) -> do
         name' <- printStringAtAAC CaptureComments name (showPprUnsafe a)
         return (Just (name',a))
-  (AddEpAnn _ close') <- markKwC CaptureComments (AddEpAnn kwc close)
-  return (open', mname', close')
-
-adornments :: NameAdornment -> (AnnKeywordId, AnnKeywordId)
-adornments NameParens     = (AnnOpenP, AnnCloseP)
-adornments NameParensHash = (AnnOpenPH, AnnClosePH)
-adornments NameBackquotes = (AnnBackquote, AnnBackquote)
-adornments NameSquare     = (AnnOpenS, AnnCloseS)
+  adorn1 <- markNameAdornmentC adorn0
+  return (adorn1, mname')
 
 markTrailing :: (Monad m, Monoid w) => [TrailingAnn] -> EP w m [TrailingAnn]
 markTrailing ts = do
@@ -4537,10 +4520,10 @@ instance (ExactPrint (Match GhcPs (LocatedA body)))
     debugM $ "LocatedL [LMatch"
     -- TODO: markAnnList?
     an0 <- markLensFun' an lal_rest markEpToken
-    an1 <- markLensMAA an0 lal_open
+    an1 <- markLensBracketsO an0 lal_brackets
     an2 <- markEpAnnAllLT an1 lal_semis
     a' <- markAnnotated a
-    an3 <- markLensMAA an2 lal_close
+    an3 <- markLensBracketsC an2 lal_brackets
     return (L an3 a')
 
 instance ExactPrint (LocatedLW [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsExpr GhcPs)))]) where
@@ -4564,9 +4547,9 @@ instance ExactPrint (LocatedLW [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsCmd Gh
   setAnnotationAnchor = setAnchorAn
   exact (L ann es) = do
     debugM $ "LocatedL [CmdLStmt"
-    an0 <- markLensMAA ann lal_open
+    an0 <- markLensBracketsO ann lal_brackets
     es' <- mapM markAnnotated es
-    an1 <- markLensMAA an0 lal_close
+    an1 <- markLensBracketsC an0 lal_brackets
     return (L an1 es')
 
 instance ExactPrint (LocatedL [LocatedA (ConDeclField GhcPs)]) where
diff --git a/utils/check-exact/Main.hs b/utils/check-exact/Main.hs
index dc3721754916b5b31be362733744703cadefde8d..9fcb5d4380c6e59be3c0457a3df5b1a5afb9b43a 100644
--- a/utils/check-exact/Main.hs
+++ b/utils/check-exact/Main.hs
@@ -530,8 +530,8 @@ changeLocalDecls libdir (L l p) = do
             (os:oldSigs) = concatMap decl2Sig  oldDecls'
             os' = setEntryDP os (DifferentLine 2 0)
         let sortKey = captureOrderBinds decls
-        let (EpAnn anc (AnnList (Just _) a b c dd e) cs) = van
-        let van' = (EpAnn anc (AnnList (Just (EpaDelta noSrcSpan (DifferentLine 1 5) [])) a b c dd e) cs)
+        let (EpAnn anc (AnnList (Just _) a b c dd) cs) = van
+        let van' = (EpAnn anc (AnnList (Just (EpaDelta noSrcSpan (DifferentLine 1 5) [])) a b c dd) cs)
         let binds' = (HsValBinds van'
                           (ValBinds sortKey (decl':oldBinds)
                                           (sig':os':oldSigs)))
@@ -558,7 +558,7 @@ changeLocalDecls2 libdir (L l p) = do
         let anc = (EpaDelta noSrcSpan (DifferentLine 1 3) [])
         let anc2 = (EpaDelta noSrcSpan (DifferentLine 1 5) [])
         let an = EpAnn anc
-                        (AnnList (Just anc2) Nothing Nothing
+                        (AnnList (Just anc2) ListNone
                                  []
                                  (EpTok (EpaDelta noSrcSpan (SameLine 0) []))
                                  [])
@@ -885,8 +885,7 @@ addHiding1 _libdir (L l p) = do
           v2 = L (           noAnnSrcSpanDP0) (IEVar Nothing (L noAnnSrcSpanDP0 (IEName noExtField n2)) Nothing)
           impHiding = L (EpAnn d0
                                (AnnList Nothing
-                                        (Just (AddEpAnn AnnOpenP  d1))
-                                        (Just (AddEpAnn AnnCloseP d0))
+                                        (ListParens (EpTok d1) (EpTok d0))
                                         []
                                         (EpTok d1,[])
                                         [])
@@ -911,8 +910,7 @@ addHiding2 _libdir top = do
           Just (_,L _lh ns) = ideclImportList imp1
           lh' = (EpAnn d0
                        (AnnList Nothing
-                                (Just (AddEpAnn AnnOpenP  d1))
-                                (Just (AddEpAnn AnnCloseP d0))
+                                (ListParens (EpTok d1) (EpTok d0))
                                 []
                                 (EpTok d1, [])
                                 [])
diff --git a/utils/check-exact/Transform.hs b/utils/check-exact/Transform.hs
index eed3d29806f13cfad7db8601ef05d4079c05143c..63d36c447225535412bbef3dd6ef96595a68f88f 100644
--- a/utils/check-exact/Transform.hs
+++ b/utils/check-exact/Transform.hs
@@ -1088,7 +1088,7 @@ oldWhereAnnotation (EpAnn anc an cs) ww _oldSpan = an'
   -- TODO: when we set DP (0,0) for the HsValBinds EpEpaLocation,
   -- change the AnnList anchor to have the correct DP too
   where
-    (AnnList ancl o c s _r t) = an
+    (AnnList ancl p s _r t) = an
     w = case ww of
       WithWhere -> EpTok (EpaDelta noSrcSpan (SameLine 0) [])
       WithoutWhere -> NoEpTok
@@ -1097,7 +1097,7 @@ oldWhereAnnotation (EpAnn anc an cs) ww _oldSpan = an'
             WithWhere -> (anc, ancl)
             WithoutWhere -> (anc, ancl)
     an' = EpAnn anc'
-                (AnnList ancl' o c s w t)
+                (AnnList ancl' p s w t)
                 cs
 
 newWhereAnnotation :: WithWhere -> (EpAnn (AnnList (EpToken "where")))
@@ -1109,7 +1109,7 @@ newWhereAnnotation ww = an
     WithWhere -> EpTok (EpaDelta noSrcSpan (SameLine 0) [])
     WithoutWhere -> NoEpTok
   an = EpAnn anc
-              (AnnList (Just anc2) Nothing Nothing [] w [])
+              (AnnList (Just anc2) ListNone [] w [])
               emptyComments
 
 -- ---------------------------------------------------------------------
diff --git a/utils/check-exact/Utils.hs b/utils/check-exact/Utils.hs
index 0a20d7012b3789bc4cdef1fbef592ae9f6206b82..bd29f64913d846b23cc61249e1332356a215ea75 100644
--- a/utils/check-exact/Utils.hs
+++ b/utils/check-exact/Utils.hs
@@ -34,7 +34,6 @@ import GHC.Types.Name.Reader
 import GHC.Types.SrcLoc
 import GHC.Driver.Ppr
 import GHC.Data.FastString
-import qualified GHC.Data.Strict as Strict
 import GHC.Base (NonEmpty(..))
 import GHC.Parser.Lexer (allocateComments)
 
@@ -140,13 +139,6 @@ undelta (l,_) (DifferentLine dl dc) (LayoutStartCol co) = (fl,fc)
     fl = l + dl
     fc = co + dc
 
-undeltaSpan :: RealSrcSpan -> AnnKeywordId -> DeltaPos -> AddEpAnn
-undeltaSpan anc kw dp = AddEpAnn kw (EpaSpan (RealSrcSpan sp Strict.Nothing))
-  where
-    (l,c) = undelta (ss2pos anc) dp (LayoutStartCol 0)
-    len = length (keywordToString kw)
-    sp = range2rs ((l,c),(l,c+len))
-
 -- ---------------------------------------------------------------------
 
 adjustDeltaForOffset :: LayoutStartCol -> DeltaPos -> DeltaPos
@@ -320,8 +312,8 @@ insertTopLevelCppComments (HsModule (XModulePs an lo mdeprec mbDoc) mmn mexports
                          where
                            hc1' = workInComments (comments an2) csh'
                            an3' = an2 { comments = hc1' }
-                           (csh', cs0b') = case al_open $ anns l of
-                               Just (AddEpAnn _ (EpaSpan (RealSrcSpan s _))) ->(h, n)
+                           (csh', cs0b') = case annListBracketsLocs $ al_brackets $ anns l of
+                               (EpaSpan (RealSrcSpan s _),_) ->(h, n)
                                  where
                                    (h,n) = break (\(L ll _) -> (ss2pos $ anchor ll) > (ss2pos s) )
                                        cs0b
@@ -355,6 +347,14 @@ insertTopLevelCppComments (HsModule (XModulePs an lo mdeprec mbDoc) mmn mexports
         cs4' = workInComments cs4 these
         (xs',rest') = allocPreceding xs rest
 
+annListBracketsLocs :: AnnListBrackets -> (EpaLocation,EpaLocation)
+annListBracketsLocs (ListParens o c) = (getEpTokenLoc o,    getEpTokenLoc c)
+annListBracketsLocs (ListBraces o c) = (getEpTokenLoc o,    getEpTokenLoc c)
+annListBracketsLocs (ListSquare o c) = (getEpTokenLoc o,    getEpTokenLoc c)
+annListBracketsLocs (ListBanana o c) = (getEpUniTokenLoc o, getEpUniTokenLoc c)
+annListBracketsLocs ListNone         = (noAnn,              noAnn)
+
+
 data SplitWhere = Before | After
 
 splitOnWhere :: SplitWhere -> EpToken "where" -> [LEpaComment] -> ([LEpaComment], [LEpaComment])
@@ -586,9 +586,6 @@ setTrailingAnnLoc (AddVbarAnn _)    ss = (AddVbarAnn ss)
 setTrailingAnnLoc (AddDarrowAnn _)  ss = (AddDarrowAnn ss)
 setTrailingAnnLoc (AddDarrowUAnn _) ss = (AddDarrowUAnn ss)
 
-addEpAnnLoc :: AddEpAnn -> EpaLocation
-addEpAnnLoc (AddEpAnn _ l) = l
-
 -- ---------------------------------------------------------------------
 
 type DeclsByTag a = Map.Map DeclTag [(RealSrcSpan, a)]
diff --git a/utils/haddock/haddock-api/src/Haddock/Types.hs b/utils/haddock/haddock-api/src/Haddock/Types.hs
index a8a24a8ea69de30acc1a7d25379cb95cc89310c9..e15be9ceab4211c2a1dcbd197ca0dc172c787c2a 100644
--- a/utils/haddock/haddock-api/src/Haddock/Types.hs
+++ b/utils/haddock/haddock-api/src/Haddock/Types.hs
@@ -998,40 +998,31 @@ instance NFData (EpAnn NameAnn) where
   rnf (EpAnn en ann cs) = en `deepseq` ann `deepseq` cs `deepseq` ()
 
 instance NFData NameAnn where
-  rnf (NameAnn a b c d e) =
+  rnf (NameAnn a b c) =
     a `deepseq`
       b `deepseq`
         c `deepseq`
-          d `deepseq`
-            e `deepseq`
-              ()
-  rnf (NameAnnCommas a b c d e) =
+           ()
+  rnf (NameAnnCommas a b c) =
     a `deepseq`
       b `deepseq`
         c `deepseq`
-          d `deepseq`
-            e `deepseq`
-              ()
-  rnf (NameAnnBars a b c d e) =
+          ()
+  rnf (NameAnnBars a b c) =
     a `deepseq`
       b `deepseq`
         c `deepseq`
-          d `deepseq`
-            e `deepseq`
-              ()
-  rnf (NameAnnOnly a b c d) =
+          ()
+  rnf (NameAnnOnly a b) =
     a `deepseq`
       b `deepseq`
-        c `deepseq`
-          d `deepseq`
-            ()
-  rnf (NameAnnRArrow a b c d e) =
+        ()
+  rnf (NameAnnRArrow a b c d) =
     a `deepseq`
       b `deepseq`
         c `deepseq`
           d `deepseq`
-            e `deepseq`
-              ()
+            ()
   rnf (NameAnnQuote a b c) =
     a `deepseq`
       b `deepseq`
@@ -1047,10 +1038,11 @@ instance NFData TrailingAnn where
   rnf (AddDarrowUAnn epaL) = rnf epaL
 
 instance NFData NameAdornment where
-  rnf NameParens = ()
-  rnf NameParensHash = ()
-  rnf NameBackquotes = ()
-  rnf NameSquare = ()
+  rnf (NameParens  o c) =  o `deepseq` c `seq` ()
+  rnf (NameParensHash o c) =  o `deepseq` c `seq` ()
+  rnf (NameBackquotes o c) =  o `deepseq` c `seq` ()
+  rnf (NameSquare o c) =  o `deepseq` c `seq` ()
+  rnf NameNoAdornment = ()
 
 instance NFData NoComments where
   rnf NoComments = ()
@@ -1085,3 +1077,15 @@ instance NFData BufPos where
 instance NFData DeltaPos where
   rnf (SameLine n) = rnf n
   rnf (DifferentLine n m) = n `deepseq` m `deepseq` ()
+
+instance NFData (EpToken tok) where
+  rnf (EpTok l) = rnf l
+  rnf NoEpTok = ()
+
+instance NFData (EpUniToken tok toku) where
+  rnf (EpUniTok l s) = l `deepseq` s `deepseq` ()
+  rnf NoEpUniTok = ()
+
+instance NFData IsUnicodeSyntax where
+  rnf NormalSyntax = ()
+  rnf UnicodeSyntax = ()