diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for typelet
+
+## 0.1.0.0 -- 2021-12-17 
+
+* First version.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,9 @@
+-- | Custom setup to support doctest
+--
+-- Taken directly from <https://hackage.haskell.org/package/cabal-doctest>.
+module Main where
+
+import Distribution.Extra.Doctest (defaultMainWithDoctests)
+
+main :: IO ()
+main = defaultMainWithDoctests "doctest-typelet"
diff --git a/doctest-examples/DoctestExamplesTypeLet.hs b/doctest-examples/DoctestExamplesTypeLet.hs
new file mode 100644
--- /dev/null
+++ b/doctest-examples/DoctestExamplesTypeLet.hs
@@ -0,0 +1,168 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-- | Doctests to verify the plugin's custom type errors
+--
+-- Testing ghc type errors is a bit of a quagmire. For some use cases,
+-- deferred type errors can be used to turn the compile time errors into
+-- runtime errors which can then be tested in the usual way. However, this does
+-- not work terribly well for constraints. There are various tickets open about
+-- this, which (frustratingly) pull in opposite directions:
+--
+-- * <https://gitlab.haskell.org/ghc/ghc/-/issues/11197>
+-- * <https://gitlab.haskell.org/ghc/ghc/-/issues/16249>
+--
+-- So instead we use docstring to do so, but that too is not that easy to get
+-- working. The first problem is the right parameters must be passed to doctest,
+-- in particular, the package flags. There are multiple ways to achieve this:
+--
+-- * <https://github.com/sol/doctest#running-doctest-for-a-cabal-package>
+--
+--   The readme on github suggests to run
+--
+--   > cabal repl --with-ghc=doctest
+--
+--   but this doesn't work terribly well with cabal's dependency resolution.
+--
+-- * <https://hackage.haskell.org/package/doctest>
+--
+--   The readme of the released package suggests simply constructing arguments
+--   by hand
+--
+--   > main = doctest ["-isrc", "src/Main.hs"]
+--
+--   but this is painful; a realistic set of arguments, especially package
+--   dependencies, is hard to construct manually in such a way that it
+--   correctly integrates with dependency resolution.
+--
+-- * <https://github.com/phadej/cabal-extras/blob/master/cabal-docspec/MANUAL.md>
+--
+--   @cabal-docspec@ is an entirely alternative solution, but is not released.
+--   It might warrant a closer look though; in particular, the fact that it
+--   avoids interpreted code might help with the "self-dependency" issue listed
+--   below (see also <https://github.com/sol/doctest/pull/217>).
+--
+-- * <https://hackage.haskell.org/package/cabal-doctest>
+--
+--   Technically deprecated, although it seems that it's being maintained still
+--   and Oleg informs me that Andres Abel "undeprecated" it, whatever that means.
+--
+-- The last option seems to be the best, at present, but here two there are some
+-- hurdles, some minor, some more significant.
+--
+-- * The setup instructions are pretty good, but the documentation is a little
+--   confusing. In particular, the argument to @defaultMainWithDoctests@
+--
+--   <https://hackage.haskell.org/package/cabal-doctest-1.0.9/docs/Distribution-Extra-Doctest.html#v:defaultMainWithDoctests>
+--
+--   /must/ be the name of the /cabal component/ that is the test-suite
+--   that is meant to run doctest; if that is wrong, simply nothing happens
+--   (no @Build_doctests@ module is built, but nor is there an error message).
+--
+-- * cabal-doctest supports running doctest on the main library in a cabal file
+--   as well as on executables, /but not on test suites/ (though it would be a
+--   minor patch to address this). This matters because of the next problem:
+--
+-- * It seems to be impossible to load the @TypeLet@ plugin defined /in/ the
+--   library while doctesting that same library. Using
+--
+--   > >>> :set -fplugin=TypeLet
+--   > >>> (castEqual :: Int -> Int) 1
+--
+--   is accepted in the sense that ghc doesn't complain about TypeLet being an
+--   unknown plugin (unlike when that name is changed to a non-existent
+--   plugin), but the plugin nonetheless doesn't actually seem to load:
+--   this examples leads to error about a missing @Equal Int Int@ instance.
+--   I still do not understand what's happening here.
+--
+-- * We therefore have the doctests in this regular (non test-suite) module.
+--   Of course, users would not need that executable, so both this example
+--   executable as well as the doctest test suite that runs doctest /on/
+--   this example executable as only built if with @+build-doctest-examples@.
+module Main where
+
+import TypeLet
+
+-- $setup
+-- >>> :set -fplugin=TypeLet
+-- >>> :set -XScopedTypeVariables
+
+{-------------------------------------------------------------------------------
+  Tests proper
+-------------------------------------------------------------------------------}
+
+-- | Examples of casts between simple different types
+--
+-- >>> (castEqual :: Int -> Bool) 1
+-- ...
+-- ...Couldn't match...Int...Bool...
+-- ...
+--
+-- >>> (castEqual :: Int -> Char) 1
+-- ...
+-- ...Couldn't match...Int...Char...
+-- ...
+simpleMismatch :: ()
+simpleMismatch = ()
+
+-- | Let with non-variable left-hand side
+--
+-- NOTE: We see this error multiple times, but that seems to be a doctest thing
+-- rather than anything the plugin does: the more doctest test cases I add, the
+-- more often I see the error repeated. In regular (non-doctest) code I don't
+-- see those repeats.
+--
+-- >>> let aux :: Let Int Int => () ; aux = castEqual () in aux
+-- ...
+-- ...Let with non-variable LHS: Int := Int
+-- ...
+letWithNonVarLHS :: ()
+letWithNonVarLHS = ()
+
+-- | Recursive let bindings
+--
+-- I'm not actually sure how these could arise in practice, especially when we
+-- have the skolem check in place as well. But perhaps it's possible with some
+-- cunning scheme where we introduce regular (unification) variables that then
+-- unify to skolem variables? For now we err on the side of caution and detect
+-- this explicitly; we /may/ want to reconsider that at some point if the check
+-- turns out to be expensive in practice.
+--
+-- >>> :{
+--   let cycle :: (Let a b, Let b a) => (a, b) -> (a, b)
+--       cycle (a, b) = (castEqual b, castEqual a)
+--   in cycle ('a', 'b')
+-- :}
+-- ...
+-- ...Cycle in type-level let bindings: a := b, b := a
+-- ...
+letCycle :: ()
+letCycle = ()
+
+-- | Non-skolem LHS
+--
+-- See 'NonSkolemLHS' for details.
+--
+-- >>> :{
+--   \(x :: a) ->
+--     let
+--       y :: Let a Integer => a
+--       y = castEqual (1 :: Integer)
+--     in y
+-- :}
+-- ...
+-- ...Let with non-skolem LHS: a := Integer
+-- ...
+letWithNonSkolemLHS :: ()
+letWithNonSkolemLHS = ()
+
+{-------------------------------------------------------------------------------
+  Sanity check
+-------------------------------------------------------------------------------}
+
+-- | Make sure the plugin works (independent of doctest)
+sanityCheck :: Int
+sanityCheck = castEqual (1 :: Int)
+
+main :: IO ()
+main = print sanityCheck
diff --git a/doctest/DoctestTypeLet.hs b/doctest/DoctestTypeLet.hs
new file mode 100644
--- /dev/null
+++ b/doctest/DoctestTypeLet.hs
@@ -0,0 +1,19 @@
+-- | Doctest driver
+--
+-- This entire module is taken directly from
+-- <https://hackage.haskell.org/package/cabal-doctest>.
+module Main where
+
+import Build_doctests (Component (..), components)
+import Data.Foldable (for_)
+import System.Environment (unsetEnv)
+import Test.DocTest (doctest)
+
+main :: IO ()
+main = do
+    for_ components $ \(Component name flags pkgs sources) -> do
+      print name
+      putStrLn "----------------------------------------"
+      let args = flags ++ pkgs ++ sources
+      unsetEnv "GHC_ENVIRONMENT"
+      doctest args
diff --git a/src/TypeLet.hs b/src/TypeLet.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet.hs
@@ -0,0 +1,4 @@
+module TypeLet (module X) where
+
+import TypeLet.Plugin  as X
+import TypeLet.UserAPI as X
diff --git a/src/TypeLet/Plugin.hs b/src/TypeLet/Plugin.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet/Plugin.hs
@@ -0,0 +1,111 @@
+module TypeLet.Plugin (plugin) where
+
+import Prelude hiding (cycle)
+
+import Data.Traversable (forM)
+
+import GHC.Plugins (Plugin(..), defaultPlugin, purePlugin)
+
+import TypeLet.Plugin.Constraints
+import TypeLet.Plugin.GhcTcPluginAPI
+import TypeLet.Plugin.NameResolution
+import TypeLet.Plugin.Substitution
+
+{-------------------------------------------------------------------------------
+  Top-level plumbing
+-------------------------------------------------------------------------------}
+
+plugin :: Plugin
+plugin = defaultPlugin {
+      pluginRecompile  = purePlugin
+    , tcPlugin         = \_cmdline -> Just . mkTcPlugin $ TcPlugin {
+                               tcPluginInit    = resolveNames
+                             , tcPluginSolve   = solve
+                             , tcPluginRewrite = \_st -> emptyUFM
+                             , tcPluginStop    = \_st -> return ()
+                             }
+    }
+
+{-------------------------------------------------------------------------------
+  Constraint resolution
+
+  General approach: regard @Let@ constraints as defining a substitution, and
+  then resolve @Equal@ constraints by /applying/ that substitution and
+  simplifying to a derived equality constraint (derived instead of a new wanted
+  constraint, because we don't actually need the evidence).
+-------------------------------------------------------------------------------}
+
+-- | Main interface to constraint resolution
+--
+-- NOTE: For now we are completely ignoring the derived constraints.
+solve :: ResolvedNames -> TcPluginSolver
+solve rn given wanted
+  | null wanted = simplifyGivens rn given
+  | otherwise   = simplifyWanteds rn given wanted
+
+-- | Simplify givens
+--
+-- We (currently?) never simplify any givens, so we just two empty lists,
+-- indicating that there no constraints were removed and none got added.
+simplifyGivens ::
+     ResolvedNames  -- ^ Result of name resolution (during init)
+  -> [Ct]           -- ^ Given constraints
+  -> TcPluginM 'Solve TcPluginSolveResult
+simplifyGivens _st _given = return $ TcPluginOk [] []
+
+-- | Simplify wanteds
+--
+-- This function provides the key functionality of the plugin.
+--
+-- We resolve 'Equal' constraints to /nominal/ equality constraints: we want
+-- 'cast' to resolve @Let@ bindings, but not additionally work as 'coerce'.
+simplifyWanteds ::
+     ResolvedNames  -- ^ Result of name resolution (during init)
+  -> [Ct]           -- ^ Given constraints
+  -> [Ct]           -- ^ Wanted constraints
+  -> TcPluginM 'Solve TcPluginSolveResult
+simplifyWanteds rn given wanted = do
+    case parseAll (parseLet rn) given of
+      Left err ->
+        errWith $ formatInvalidLet <$> err
+      Right lets -> do
+        case letsToSubst lets of
+          Left cycle ->
+            errWith $ formatLetCycle cycle
+          Right subst -> do
+            (solved, new) <- fmap unzip $
+              forM (parseAll' (withOrig (parseEqual rn)) wanted) $
+                uncurry (solveEqual subst)
+            return $ TcPluginOk solved new
+  where
+    -- Work-around bug in ghc, making sure the location is set correctly
+    newWanted' :: CtLoc -> PredType -> TcPluginM 'Solve CtEvidence
+    newWanted' l w = setCtLocM l $ newWanted l w
+
+    errWith ::
+         GenLocated CtLoc TcPluginErrorMessage
+      -> TcPluginM 'Solve TcPluginSolveResult
+    errWith (L l err) = do
+        errAsTyp <- mkTcPluginErrorTy err
+        mkErr <$> newWanted' l errAsTyp
+      where
+        mkErr :: CtEvidence -> TcPluginSolveResult
+        mkErr = TcPluginContradiction . (:[]) . mkNonCanonical
+
+    -- Solve an Equal constraint by applying the substitution and turning it
+    -- into a nominal equality constraint
+    solveEqual ::
+         TCvSubst
+      -> Ct                       -- Original Equal constraint
+      -> GenLocated CtLoc CEqual  -- Parsed Equal constraint
+      -> TcPluginM 'Solve ((EvTerm, Ct), Ct)
+    solveEqual subst orig (L l parsed) = do
+        ev <- newWanted' l $
+                mkPrimEqPredRole
+                  Nominal
+                  (substTy subst (equalLHS parsed))
+                  (substTy subst (equalRHS parsed))
+        return (
+            (evidenceEqual rn parsed, orig)
+          , mkNonCanonical ev
+          )
diff --git a/src/TypeLet/Plugin/Constraints.hs b/src/TypeLet/Plugin/Constraints.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet/Plugin/Constraints.hs
@@ -0,0 +1,172 @@
+module TypeLet.Plugin.Constraints (
+    -- * Constraints recognized by the plugin
+    CEqual(..)
+  , CLet(..)
+    -- * Parsing
+    -- ** Infrastructure
+  , ParseResult(..)
+  , parseAll
+  , parseAll'
+  , withOrig
+    -- ** SPecific parsers
+  , InvalidLet(..)
+  , parseEqual
+  , parseLet
+    -- * Evidence construction
+  , evidenceEqual
+    -- * Formatting errors
+  , formatCLet
+  , formatInvalidLet
+  ) where
+
+import Data.Bifunctor
+import Data.Void
+
+import TypeLet.Plugin.GhcTcPluginAPI
+import TypeLet.Plugin.NameResolution
+
+{-------------------------------------------------------------------------------
+  Constraints recognized by the plugin
+-------------------------------------------------------------------------------}
+
+data CLet = CLet {
+      letKind :: Type
+    , letLHS  :: TyVar
+    , letRHS  :: Type
+    }
+
+data CEqual = CEqual {
+      equalKind :: Type
+    , equalLHS  :: Type
+    , equalRHS  :: Type
+    }
+
+instance Outputable CLet where
+  ppr (CLet k a b) = parens $ text "Let" <+> ppr k <+> ppr a <+> ppr b
+
+instance Outputable CEqual where
+  ppr (CEqual k a b) = parens $ text "Equal" <+> ppr k <+> ppr a <+> ppr b
+
+{-------------------------------------------------------------------------------
+  Parsing infrastructure
+-------------------------------------------------------------------------------}
+
+data ParseResult e a =
+    -- | Parse successful
+    ParseOk a
+
+    -- | Different constraint than we're looking for (does not imply an error)
+  | ParseNoMatch
+
+    -- | Constraint of the shape we're looking for, but something is wrong
+  | ParseError e
+  deriving (Functor)
+
+instance Bifunctor ParseResult where
+  bimap _ g (ParseOk a)    = ParseOk (g a)
+  bimap _ _ ParseNoMatch   = ParseNoMatch
+  bimap f _ (ParseError e) = ParseError (f e)
+
+-- | Apply parser to each value in turn, bailing at the first error
+parseAll :: forall e a b. (a -> ParseResult e b) -> [a] -> Either e [b]
+parseAll f = go []
+  where
+    go :: [b] -> [a] -> Either e [b]
+    go acc []     = Right (reverse acc)
+    go acc (a:as) = case f a of
+                      ParseOk b    -> go (b:acc) as
+                      ParseNoMatch -> go    acc  as
+                      ParseError e -> Left e
+
+-- | Variation on 'parseAll' which rules out the error case
+parseAll' :: (a -> ParseResult Void b) -> [a] -> [b]
+parseAll' f = aux . parseAll f
+  where
+    aux :: Either Void [b] -> [b]
+    aux (Left  v)  = absurd v
+    aux (Right bs) = bs
+
+-- | Bundle the parse result with the original value
+withOrig :: (a -> ParseResult e b) -> (a -> ParseResult e (a, b))
+withOrig f x = fmap (x, ) $ f x
+
+{-------------------------------------------------------------------------------
+  Parser for specific constraints
+
+  We can assume here that the constraint is kind correct, so if the class
+  matches, we know how many arguments
+-------------------------------------------------------------------------------}
+
+data InvalidLet =
+    -- | LHS should always be a variable
+    NonVariableLHS Type Type Type
+
+    -- | The LHS should be a /skolem/ variable
+    --
+    -- As for as ghc is concerned, the LHS should be an opaque type variable
+    -- with unknown value (only the plugin knows); certainly, ghc should not
+    -- try to unify it with anything.
+  | NonSkolemLHS Type TyVar Type
+
+parseLet ::
+     ResolvedNames
+  -> Ct
+  -> ParseResult (GenLocated CtLoc InvalidLet) (GenLocated CtLoc CLet)
+parseLet ResolvedNames{..} ct = bimap (L $ ctLoc ct) (L $ ctLoc ct) $
+    case classifyPredType (ctPred ct) of
+      ClassPred cls [k, a, b] | cls == clsLet ->
+        case getTyVar_maybe a of
+          Nothing ->
+            ParseError $ NonVariableLHS k a b
+          Just x  ->
+            if isSkolemTyVar x
+              then ParseOk    $ CLet         k x b
+              else ParseError $ NonSkolemLHS k x b
+      _otherwise ->
+        ParseNoMatch
+
+-- | Parse 'Equal' constraints
+--
+-- Kind-correct 'Equal' constraints of any form are ok, so this cannot return
+-- errors.
+parseEqual :: ResolvedNames -> Ct -> ParseResult Void (GenLocated CtLoc CEqual)
+parseEqual ResolvedNames{..} ct = fmap (L $ ctLoc ct) $
+    case classifyPredType (ctPred ct) of
+      ClassPred cls [k, a, b] | cls == clsEqual ->
+        ParseOk $ CEqual k a b
+      _otherwise ->
+        ParseNoMatch
+
+{-------------------------------------------------------------------------------
+  Evidence construction
+-------------------------------------------------------------------------------}
+
+-- | Evidence for an 'Equal' constraint
+--
+-- TODO: should we worry about producing an evidence term that prevents floating
+-- stuff out of scope...? (the whole "coercions cannot simply be zapped" thing)
+-- See also https://gitlab.haskell.org/ghc/ghc/-/issues/8095#note_108189 .
+evidenceEqual :: ResolvedNames -> CEqual -> EvTerm
+evidenceEqual ResolvedNames{..} (CEqual k a b) =
+    evDataConApp
+      (classDataCon clsEqual)
+      [k, a, b]
+      []
+
+{-------------------------------------------------------------------------------
+  Formatting errors
+-------------------------------------------------------------------------------}
+
+formatCLet :: CLet -> TcPluginErrorMessage
+formatCLet (CLet _ a b) =
+        PrintType (mkTyVarTy a)
+    :|: Txt " := "
+    :|: PrintType b
+
+formatInvalidLet :: InvalidLet -> TcPluginErrorMessage
+formatInvalidLet (NonVariableLHS _k a b) =
+        Txt "Let with non-variable LHS: "
+    :|: PrintType a :|: Txt " := " :|: PrintType b
+formatInvalidLet (NonSkolemLHS _k a b) =
+        Txt "Let with non-skolem LHS: "
+    :|: PrintType (mkTyVarTy a) :|: Txt " := " :|: PrintType b
diff --git a/src/TypeLet/Plugin/GhcTcPluginAPI.hs b/src/TypeLet/Plugin/GhcTcPluginAPI.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet/Plugin/GhcTcPluginAPI.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE CPP #-}
+
+-- | Thin layer around ghc-tcplugin-api
+module TypeLet.Plugin.GhcTcPluginAPI (
+    -- * Standard exports
+    module GHC.TcPlugin.API
+  , module GHC.Utils.Outputable
+
+    -- * Additional re-exports
+    -- ** Type variables
+  , TyVar
+  , isSkolemTyVar
+    -- ** Substitutions
+  , TCvSubst
+  , Subst.substTy
+  , Subst.substTyWith
+  , Subst.zipTvSubst
+  , elemVarSet
+  , tyCoVarsOfType
+    -- ** Location information
+  , GenLocated(L)
+    -- ** Errors
+  , Panic.panic
+  ) where
+
+import GHC.TcPlugin.API
+
+#if MIN_VERSION_ghc(9,0,0)
+import GHC.Core.TyCo.FVs (tyCoVarsOfType)
+import GHC.Core.TyCo.Subst (TCvSubst)
+import GHC.Tc.Utils.TcType (isSkolemTyVar)
+import GHC.Types.SrcLoc (GenLocated(L))
+import GHC.Types.Var (TyVar)
+import GHC.Types.Var.Set (elemVarSet)
+
+import qualified GHC.Core.TyCo.Subst as Subst
+#endif
+
+#if MIN_VERSION_ghc(9,2,0)
+import GHC.Utils.Outputable
+import qualified GHC.Utils.Panic as Panic
+#else
+-- for ghc < 9.0, needs ghc-tcplugin-api's re-export of GHC.Utils.Outputable
+import GHC.Utils.Outputable hiding (panic)
+import qualified GHC.Utils.Outputable as Panic
+#endif
+
+#if !MIN_VERSION_ghc(9,0,0)
+
+import SrcLoc (GenLocated(L))
+import Type (TyVar)
+import VarSet (elemVarSet)
+import TcType (TCvSubst, tyCoVarsOfType, isSkolemTyVar)
+
+import qualified TcType as Subst
+
+#endif
+
diff --git a/src/TypeLet/Plugin/NameResolution.hs b/src/TypeLet/Plugin/NameResolution.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet/Plugin/NameResolution.hs
@@ -0,0 +1,43 @@
+module TypeLet.Plugin.NameResolution (
+    ResolvedNames(..)
+  , resolveNames
+  ) where
+
+import TypeLet.Plugin.GhcTcPluginAPI
+
+data ResolvedNames = ResolvedNames {
+      clsEqual :: Class
+    , clsLet   :: Class
+    }
+
+instance Outputable ResolvedNames where
+  ppr ResolvedNames{..} = vcat [
+        text "ResolvedNames {"
+      , nest 2 $ vcat [
+            text "clsEqual =" <+> ppr clsEqual
+          , text "clsLet   =" <+> ppr clsLet
+          ]
+      , text "}"
+      ]
+
+resolveNames :: TcPluginM 'Init ResolvedNames
+resolveNames = do
+    m <- do r <- findImportedModule typeletMod (Just typeletPkg)
+            case r of
+              Found _ m  -> return m
+              _otherwise -> panic $ "Could not find "
+                                 ++ showSDocUnsafe (ppr typeletMod)
+
+    -- Constraints handled by the plugin
+
+    clsEqual <- tcLookupClass =<< lookupOrig m (mkTcOcc "Equal")
+    clsLet   <- tcLookupClass =<< lookupOrig m (mkTcOcc "Let")
+
+    return ResolvedNames{..}
+  where
+    typeletMod :: ModuleName
+    typeletMod = mkModuleName "TypeLet.UserAPI"
+
+    typeletPkg :: FastString
+    typeletPkg = fsLit "typelet"
+
diff --git a/src/TypeLet/Plugin/Substitution.hs b/src/TypeLet/Plugin/Substitution.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet/Plugin/Substitution.hs
@@ -0,0 +1,114 @@
+module TypeLet.Plugin.Substitution (
+    letsToSubst
+  , Cycle(..)
+  , formatLetCycle
+  ) where
+
+import Data.Bifunctor
+import Data.Foldable (toList)
+import Data.List (intersperse)
+import Data.List.NonEmpty (NonEmpty(..))
+import Data.Maybe (mapMaybe)
+
+import qualified Data.Graph as G
+
+import TypeLet.Plugin.Constraints
+import TypeLet.Plugin.GhcTcPluginAPI
+
+-- | Construct idempotent substitution
+--
+-- TODO: Not entirely sure if this is correct, might be too simplistic and/or an
+-- abuse of the ghc API; it is a /whole/ lot simpler than @niFixTCvSubst@, which
+-- is disconcerning. However, it seems to work for the examples so far; perhaps
+-- our use case is simpler? Needs more thought.
+letsToSubst ::
+     [GenLocated CtLoc CLet]
+  -> Either (Cycle (GenLocated CtLoc CLet)) TCvSubst
+letsToSubst = fmap (uncurry zipTvSubst . unzip . go []) . inorder
+  where
+    go :: [(TyVar, Type)] -> [(TyVar, Type)] -> [(TyVar, Type)]
+    go acc []         = acc
+    go acc ((x, t):s) = go ((x, t) : map (second (subst1 x t)) acc) s
+
+    subst1 :: TyVar -> Type -> Type -> Type
+    subst1 x t = substTyWith [x] [t]
+
+-- | Order the assignments
+--
+-- Suppose we have two assignments
+--
+-- > x := xT
+-- > y := yT    where  x in (freevars yT)
+--
+-- Then the substitution should map @y@ to @(x := xT) yT@. We do this by
+-- constructing the substitution in order, adding assignments one by one,
+-- applying them to all assignments already in the accumulated substitution
+-- as we go. In this example, this means adding @y := yT@ /first/, so that
+-- we can apply @x := xT@ later (note that recursive definitions are
+-- impossible in our use case).
+--
+-- In order to find the right order, we construct a graph of assignments. To
+-- continue with our example, this graph will contain an edge
+--
+-- > (y := yT) -----> (x := xT)
+--
+-- The required assignment ordering is then obtained by topological sort.
+inorder ::
+     [GenLocated CtLoc CLet]
+  -> Either (Cycle (GenLocated CtLoc CLet)) [(TyVar, Type)]
+inorder lets =
+    case cycles edges of
+      c:_ -> Left c
+      []  -> Right $ [
+          (x, t)
+        | (L _ (CLet _ x t), _, _) <- map nodeFromVertex $ G.topSort graph
+        ]
+  where
+    graph          :: G.Graph
+    nodeFromVertex :: G.Vertex -> (GenLocated CtLoc CLet, TyVar, [TyVar])
+    _vertexFromKey :: TyVar -> Maybe G.Vertex
+    (graph, nodeFromVertex, _vertexFromKey) = G.graphFromEdges edges
+
+    edges :: [(GenLocated CtLoc CLet, TyVar, [TyVar])]
+    edges = [
+        ( l
+        , y
+        , [ x
+          | L _ (CLet _ x _) <- lets
+          , x `elemVarSet` (tyCoVarsOfType yT)
+          ]
+        )
+      | l@(L _ (CLet _ y yT)) <- lets -- variables name match description above
+      ]
+
+-- | Format a cycle
+--
+-- We (arbitrarily) pick the first 'CLet' in the cycle for the location of the
+-- error.
+formatLetCycle ::
+     Cycle (GenLocated CtLoc CLet)
+  -> GenLocated CtLoc TcPluginErrorMessage
+formatLetCycle (Cycle vs@(L l _ :| _)) = L l $
+          Txt "Cycle in type-level let bindings: "
+      :|: ( foldr1 (:|:)
+          . intersperse (Txt ", ")
+          . map (\(L _ l') -> formatCLet l')
+          $ toList vs
+          )
+
+{-------------------------------------------------------------------------------
+  Auxiliary
+-------------------------------------------------------------------------------}
+
+-- | Cycle in a graph
+data Cycle a = Cycle (NonEmpty a)
+
+cycles :: Ord key => [(node, key, [key])] -> [Cycle node]
+cycles = mapMaybe aux . G.stronglyConnComp
+  where
+    aux :: G.SCC a -> Maybe (Cycle a)
+    aux (G.AcyclicSCC _) = Nothing
+    aux (G.CyclicSCC vs) =
+        case vs of
+          v:vs'      -> Just $ Cycle (v :| vs')
+          _otherwise -> Nothing
diff --git a/src/TypeLet/UserAPI.hs b/src/TypeLet/UserAPI.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeLet/UserAPI.hs
@@ -0,0 +1,131 @@
+module TypeLet.UserAPI (
+    -- * Main classes
+    Let
+  , Equal
+  , castEqual
+    -- * Introduction forms
+  , LetT(..)
+  , letT
+  , letT'
+  , LetAs(..)
+  , letAs
+  , letAs'
+    -- * Re-exports
+  , Proxy(..)
+  ) where
+
+import Data.Proxy
+import Unsafe.Coerce (unsafeCoerce)
+
+{-------------------------------------------------------------------------------
+  Main classes
+-------------------------------------------------------------------------------}
+
+-- | Type-level @let@
+--
+-- A constraint @Let x t@ where @x@ is an (existential) type variable and @t@
+-- is an arbitrary type represents a type-level let binding @let x = t@.
+--
+-- o Introduction form
+--
+--   Type-level let bindings should be introduced using 'letT' or its slightly
+--   higher level cousin, 'letAs'.
+--
+-- o Elimination form
+--
+--   To eliminate type-level let, use 'castEqual'.
+class Let (a :: k) (b :: k)
+
+-- | Reflexivity
+--
+-- A constraint @Let x t@, where @x@ is an existential (skolem) type variable
+-- and @t@ is an arbitrary type, models a type-level @let x = t@. There is only
+-- a single instance for @Let@: reflexivity (a type is equal to itself).
+--
+-- User code normally does not work with @Let@ directly, but instead uses one of
+-- the introduction forms ('letT' and 'letAs') which take care to introduce
+-- @Let@ constraints of the right shape. When @Let@ constraints are introduced
+-- manually, the plugin will report a type error if
+--
+-- * The left-hand side is not a skolem type variable
+-- * The set of let-bindings in scope are cyclic.
+instance Let a a
+
+-- | (Nominal) type equality, up to type-level let
+--
+-- This is a class without any definitions; 'Equal a b' is instead proved by
+-- the plugin. Suppose we have a bunch of type-level let constraints in scope
+--
+-- > Let x1 t1
+-- > Let x2 t2
+-- > ...
+--
+-- Then if σ is the corresponding idempotent substitution, two types @a@ and @b@
+-- are considered 'Equal' if @σ(a)@ and @σ(b)@ are nominally equal.
+class Equal (a :: k) (b :: k)
+
+-- | Type-safe cast, using 'Equal' as the notion of equality
+--
+-- See comments for 'Equal'.
+castEqual :: Equal a b => a -> b
+-- Implementation note: marking this as NOINLINE in an attempt to make sure that
+-- @unsafeCoerce@ does not escape the scope of the evidence for @Equal@ (which,
+-- even though trivial, at least records the full time of the LHS and RHS).
+{-# NOINLINE castEqual #-}
+castEqual = unsafeCoerce
+
+{-------------------------------------------------------------------------------
+  Introduction forms
+-------------------------------------------------------------------------------}
+
+-- | 'LetT' is used along with 'letT' to introduce type-level let bindings.
+--
+-- See 'letT' for more information.
+data LetT (a :: k) where
+  LetT :: Let b a => Proxy b -> LetT a
+
+-- | Primitive way to introduce type-level let binding.
+--
+-- Usage:
+--
+-- > case letT (Proxy @t) of LetT (_ :: Proxy x) ->
+--
+-- This introduces a type-level let binding @x = t@.
+letT :: Proxy a -> LetT a
+{-# NOINLINE letT #-}
+letT p = LetT p
+
+-- | CPS form of 'letT'
+--
+-- While this is more convenient to use, the @r@ parameter itself requires
+-- careful thought.
+letT' :: forall r a. Proxy a -> (forall b. Let b a => Proxy b -> r) -> r
+{-# NOINLINE letT' #-}
+letT' pa k = case letT pa of LetT pb -> k pb
+
+-- | Used together with 'letAs' to pair a type-level let binding with a cast
+--
+-- See 'letAs' for details.
+data LetAs f (a :: k) where
+  LetAs :: Let b a => f b -> LetAs f a
+
+-- | Pair a type-level let binding with a cast
+--
+-- Often when we introduce a type-level let @x = t@, we then want to cast some
+-- term @e :: t@ to a term @e :: x@; function 'letAs' does these two things in
+-- one operation.
+--
+-- If we did the above as written, however, we would have a term @e :: x@ where
+-- we know nothing about @x@ at all (unless we cast again). This is typically
+-- not useful; instead, we go from a term @e :: f t@ to a term @e :: f x@,
+-- let-binding the type index @t@ but not the functor @f@.
+letAs :: f a -> LetAs f a
+{-# NOINLINE letAs #-}
+letAs x = LetAs x
+
+-- | CPS form of 'letAs'
+--
+-- See also comments for 'letT''.
+letAs' :: forall r f a. f a -> (forall b. Let b a => f b -> r) -> r
+{-# NOINLINE letAs' #-}
+letAs' fa k = case letAs fa of LetAs fb -> k fb
diff --git a/test/Test/Infra.hs b/test/Test/Infra.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Infra.hs
@@ -0,0 +1,36 @@
+module Test.Infra (
+    HList(..)
+  , T(..)
+  , A(..)
+  , B(..)
+  , C(..)
+  ) where
+
+import Data.Kind
+import GHC.TypeLits
+
+data HList :: [Type] -> Type where
+    HNil  :: HList '[]
+    HCons :: x -> HList xs -> HList (x : xs)
+
+data T :: Symbol -> Type where
+    MkT :: T s
+  deriving (Show, Eq)
+
+data A = A deriving (Show, Eq)
+data B = B deriving (Show, Eq)
+data C = C deriving (Show, Eq)
+
+{-------------------------------------------------------------------------------
+  Infrastructure for testing
+
+  These are standard definitions, and will definitely lead to quadratic core.
+-------------------------------------------------------------------------------}
+
+type family All (c :: k -> Constraint) (xs :: [k]) :: Constraint where
+  All c '[]       = ()
+  All c (x ': xs) = (c x, All c xs)
+
+deriving instance All Show xs => Show (HList xs)
+deriving instance All Eq   xs => Eq   (HList xs)
+
diff --git a/test/Test/Sanity.hs b/test/Test/Sanity.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Sanity.hs
@@ -0,0 +1,162 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+-- {-# OPTIONS_GHC -ddump-ds-preopt -ddump-ds -ddump-simpl -ddump-to-file #-}
+
+module Test.Sanity (tests) where
+
+import Data.Functor.Identity
+
+import TypeLet
+
+import Test.Tasty
+import Test.Tasty.HUnit
+import Test.Tasty.QuickCheck
+
+import Test.Infra
+
+tests :: TestTree
+tests = testGroup "Test.Sanity" [
+      testGroup "simple" [
+          testProperty  "reflexive"   $ castIsId castReflexive
+        , testProperty  "singleLet"   $ castIsId castSingleLet
+        , testProperty  "singleLetAs" $ castIsId castSingleLetAs
+        ]
+    , testGroup "HList" [
+          testCase "Let"          $ testHList hlistLet
+        , testCase "LetAs"        $ testHList hlistLetAs
+        , testCase "LetAsCPS_bad" $ testHList hlistLetAsCPS_bad
+        , testCase "LetAsCPS"     $ testHList hlistLetAsCPS
+        ]
+    , testGroup "Ap" [
+          testCase "Let" $ testAp apLet
+        ]
+    ]
+
+castIsId :: (Eq a, Show a, Arbitrary a) => (a -> a) -> a -> Property
+castIsId f x = x === f x
+
+testHList :: HList '[A, B, C] -> Assertion
+testHList =
+    assertEqual "" hlistBaseline
+
+testAp ::
+     (forall f r. Applicative f => (A -> B -> C -> r) -> f r)
+  -> Assertion
+testAp apTest =
+    assertEqual "" (runIdentity $ apBaseline f) (runIdentity $ apTest f)
+  where
+    f :: A -> B -> C -> HList '[A, B, C]
+    f x y z = HCons x $ HCons y $ HCons z $ HNil
+
+{-------------------------------------------------------------------------------
+  Simple casts
+-------------------------------------------------------------------------------}
+
+-- | Trivial test: no let-bounds
+--
+-- TODO: We should also make sure that non-type correct functions are rejected
+-- (they are, just don't have a test for them currently)
+castReflexive :: Int -> Int
+castReflexive = castEqual
+
+-- | Introduce single let binding, then cast there and back
+castSingleLet :: Int -> Int
+castSingleLet x =
+    case letT (Proxy @Int) of
+      LetT (_ :: Proxy t1) ->
+        let y :: t1
+            y = castEqual x
+        in castEqual y
+
+-- | Single let-as
+castSingleLetAs :: Identity Int -> Identity Int
+castSingleLetAs x =
+    case letAs x of
+      LetAs (x' :: Identity t1) ->
+        castEqual x'
+
+{-------------------------------------------------------------------------------
+  Small versions of the 'HList' tests that we use for size measurements
+
+  Since these work with only 3 indices, they are a bit more manageable for
+  easy experimentation.
+-------------------------------------------------------------------------------}
+
+{-# NOINLINE hlistBaseline #-}
+hlistBaseline :: HList '[A, B, C]
+hlistBaseline =
+      HCons A
+    $ HCons B
+    $ HCons C
+    $ HNil
+
+hlistLet :: HList '[A, B, C]
+hlistLet =
+    case letT (Proxy @(C : '[])) of { LetT (_ :: Proxy r2) ->
+    case letT (Proxy @(B : r2))  of { LetT (_ :: Proxy r1) ->
+    case letT (Proxy @(A : r1))  of { LetT (_ :: Proxy r0) ->
+
+     let xs2 :: HList r2
+         xs1 :: HList r1
+         xs0 :: HList r0
+
+         xs2 = castEqual (HCons C HNil)
+         xs1 = castEqual (HCons B xs2)
+         xs0 = castEqual (HCons A xs1)
+
+     in castEqual xs0
+    }}}
+
+hlistLetAs :: HList '[A, B, C]
+hlistLetAs =
+    case letAs (HCons C HNil) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons B xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons A xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}
+
+hlistLetAsCPS_bad :: HList '[A, B, C]
+hlistLetAsCPS_bad =
+    letAs' (HCons C HNil) $ \(xs02 :: HList t02) ->
+    letAs' (HCons B xs02) $ \(xs01 :: HList t01) ->
+    letAs' (HCons A xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
+
+hlistLetAsCPS :: HList '[A, B, C]
+hlistLetAsCPS =
+    letT' (Proxy @'[A, B, C]) $ \(_ :: Proxy r) -> castEqual $
+      letAs' @(HList r) (HCons C HNil) $ \(xs02 :: HList t02) ->
+      letAs' @(HList r) (HCons B xs02) $ \(xs01 :: HList t01) ->
+      letAs' @(HList r) (HCons A xs01) $ \(xs00 :: HList t00) ->
+        castEqual xs00
+
+{-------------------------------------------------------------------------------
+  Similarly, small versions of the @<*>@ tests.
+-------------------------------------------------------------------------------}
+
+apBaseline :: Applicative f => (A -> B -> C -> r) -> f r
+apBaseline f =
+        pure f
+    <*> pure A
+    <*> pure B
+    <*> pure C
+
+apLet :: forall f r. Applicative f => (A -> B -> C -> r) -> f r
+apLet f =
+    case letT (Proxy @(C -> r))   of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(B -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(A -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+
+          res :: f r
+
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure A
+          f02 = castEqual f01 <*> pure B
+          res = castEqual f02 <*> pure C
+
+      in res
+
+    }}}
diff --git a/test/Test/Size/Ap/Baseline/Baseline010.hs b/test/Test/Size/Ap/Baseline/Baseline010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline010.hs
@@ -0,0 +1,19 @@
+module Test.Size.Ap.Baseline.Baseline010 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix010
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
diff --git a/test/Test/Size/Ap/Baseline/Baseline020.hs b/test/Test/Size/Ap/Baseline/Baseline020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline020.hs
@@ -0,0 +1,30 @@
+module Test.Size.Ap.Baseline.Baseline020 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix020
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
diff --git a/test/Test/Size/Ap/Baseline/Baseline030.hs b/test/Test/Size/Ap/Baseline/Baseline030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline030.hs
@@ -0,0 +1,41 @@
+module Test.Size.Ap.Baseline.Baseline030 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix030
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
diff --git a/test/Test/Size/Ap/Baseline/Baseline040.hs b/test/Test/Size/Ap/Baseline/Baseline040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline040.hs
@@ -0,0 +1,52 @@
+module Test.Size.Ap.Baseline.Baseline040 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix040
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
diff --git a/test/Test/Size/Ap/Baseline/Baseline050.hs b/test/Test/Size/Ap/Baseline/Baseline050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline050.hs
@@ -0,0 +1,63 @@
+module Test.Size.Ap.Baseline.Baseline050 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix050
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
+        -- 40 .. 49
+    <*> pure (MkT @"i40")
+    <*> pure (MkT @"i41")
+    <*> pure (MkT @"i42")
+    <*> pure (MkT @"i43")
+    <*> pure (MkT @"i44")
+    <*> pure (MkT @"i45")
+    <*> pure (MkT @"i46")
+    <*> pure (MkT @"i47")
+    <*> pure (MkT @"i48")
+    <*> pure (MkT @"i49")
diff --git a/test/Test/Size/Ap/Baseline/Baseline060.hs b/test/Test/Size/Ap/Baseline/Baseline060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline060.hs
@@ -0,0 +1,74 @@
+module Test.Size.Ap.Baseline.Baseline060 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix060
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
+        -- 40 .. 49
+    <*> pure (MkT @"i40")
+    <*> pure (MkT @"i41")
+    <*> pure (MkT @"i42")
+    <*> pure (MkT @"i43")
+    <*> pure (MkT @"i44")
+    <*> pure (MkT @"i45")
+    <*> pure (MkT @"i46")
+    <*> pure (MkT @"i47")
+    <*> pure (MkT @"i48")
+    <*> pure (MkT @"i49")
+        -- 50 .. 59
+    <*> pure (MkT @"i50")
+    <*> pure (MkT @"i51")
+    <*> pure (MkT @"i52")
+    <*> pure (MkT @"i53")
+    <*> pure (MkT @"i54")
+    <*> pure (MkT @"i55")
+    <*> pure (MkT @"i56")
+    <*> pure (MkT @"i57")
+    <*> pure (MkT @"i58")
+    <*> pure (MkT @"i59")
diff --git a/test/Test/Size/Ap/Baseline/Baseline070.hs b/test/Test/Size/Ap/Baseline/Baseline070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline070.hs
@@ -0,0 +1,85 @@
+module Test.Size.Ap.Baseline.Baseline070 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix070
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
+        -- 40 .. 49
+    <*> pure (MkT @"i40")
+    <*> pure (MkT @"i41")
+    <*> pure (MkT @"i42")
+    <*> pure (MkT @"i43")
+    <*> pure (MkT @"i44")
+    <*> pure (MkT @"i45")
+    <*> pure (MkT @"i46")
+    <*> pure (MkT @"i47")
+    <*> pure (MkT @"i48")
+    <*> pure (MkT @"i49")
+        -- 50 .. 59
+    <*> pure (MkT @"i50")
+    <*> pure (MkT @"i51")
+    <*> pure (MkT @"i52")
+    <*> pure (MkT @"i53")
+    <*> pure (MkT @"i54")
+    <*> pure (MkT @"i55")
+    <*> pure (MkT @"i56")
+    <*> pure (MkT @"i57")
+    <*> pure (MkT @"i58")
+    <*> pure (MkT @"i59")
+        -- 60 .. 69
+    <*> pure (MkT @"i60")
+    <*> pure (MkT @"i61")
+    <*> pure (MkT @"i62")
+    <*> pure (MkT @"i63")
+    <*> pure (MkT @"i64")
+    <*> pure (MkT @"i65")
+    <*> pure (MkT @"i66")
+    <*> pure (MkT @"i67")
+    <*> pure (MkT @"i68")
+    <*> pure (MkT @"i69")
diff --git a/test/Test/Size/Ap/Baseline/Baseline080.hs b/test/Test/Size/Ap/Baseline/Baseline080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline080.hs
@@ -0,0 +1,96 @@
+module Test.Size.Ap.Baseline.Baseline080 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix080
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
+        -- 40 .. 49
+    <*> pure (MkT @"i40")
+    <*> pure (MkT @"i41")
+    <*> pure (MkT @"i42")
+    <*> pure (MkT @"i43")
+    <*> pure (MkT @"i44")
+    <*> pure (MkT @"i45")
+    <*> pure (MkT @"i46")
+    <*> pure (MkT @"i47")
+    <*> pure (MkT @"i48")
+    <*> pure (MkT @"i49")
+        -- 50 .. 59
+    <*> pure (MkT @"i50")
+    <*> pure (MkT @"i51")
+    <*> pure (MkT @"i52")
+    <*> pure (MkT @"i53")
+    <*> pure (MkT @"i54")
+    <*> pure (MkT @"i55")
+    <*> pure (MkT @"i56")
+    <*> pure (MkT @"i57")
+    <*> pure (MkT @"i58")
+    <*> pure (MkT @"i59")
+        -- 60 .. 69
+    <*> pure (MkT @"i60")
+    <*> pure (MkT @"i61")
+    <*> pure (MkT @"i62")
+    <*> pure (MkT @"i63")
+    <*> pure (MkT @"i64")
+    <*> pure (MkT @"i65")
+    <*> pure (MkT @"i66")
+    <*> pure (MkT @"i67")
+    <*> pure (MkT @"i68")
+    <*> pure (MkT @"i69")
+        -- 70 .. 79
+    <*> pure (MkT @"i70")
+    <*> pure (MkT @"i71")
+    <*> pure (MkT @"i72")
+    <*> pure (MkT @"i73")
+    <*> pure (MkT @"i74")
+    <*> pure (MkT @"i75")
+    <*> pure (MkT @"i76")
+    <*> pure (MkT @"i77")
+    <*> pure (MkT @"i78")
+    <*> pure (MkT @"i79")
diff --git a/test/Test/Size/Ap/Baseline/Baseline090.hs b/test/Test/Size/Ap/Baseline/Baseline090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline090.hs
@@ -0,0 +1,107 @@
+module Test.Size.Ap.Baseline.Baseline090 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix090
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
+        -- 40 .. 49
+    <*> pure (MkT @"i40")
+    <*> pure (MkT @"i41")
+    <*> pure (MkT @"i42")
+    <*> pure (MkT @"i43")
+    <*> pure (MkT @"i44")
+    <*> pure (MkT @"i45")
+    <*> pure (MkT @"i46")
+    <*> pure (MkT @"i47")
+    <*> pure (MkT @"i48")
+    <*> pure (MkT @"i49")
+        -- 50 .. 59
+    <*> pure (MkT @"i50")
+    <*> pure (MkT @"i51")
+    <*> pure (MkT @"i52")
+    <*> pure (MkT @"i53")
+    <*> pure (MkT @"i54")
+    <*> pure (MkT @"i55")
+    <*> pure (MkT @"i56")
+    <*> pure (MkT @"i57")
+    <*> pure (MkT @"i58")
+    <*> pure (MkT @"i59")
+        -- 60 .. 69
+    <*> pure (MkT @"i60")
+    <*> pure (MkT @"i61")
+    <*> pure (MkT @"i62")
+    <*> pure (MkT @"i63")
+    <*> pure (MkT @"i64")
+    <*> pure (MkT @"i65")
+    <*> pure (MkT @"i66")
+    <*> pure (MkT @"i67")
+    <*> pure (MkT @"i68")
+    <*> pure (MkT @"i69")
+        -- 70 .. 79
+    <*> pure (MkT @"i70")
+    <*> pure (MkT @"i71")
+    <*> pure (MkT @"i72")
+    <*> pure (MkT @"i73")
+    <*> pure (MkT @"i74")
+    <*> pure (MkT @"i75")
+    <*> pure (MkT @"i76")
+    <*> pure (MkT @"i77")
+    <*> pure (MkT @"i78")
+    <*> pure (MkT @"i79")
+        -- 80 .. 89
+    <*> pure (MkT @"i80")
+    <*> pure (MkT @"i81")
+    <*> pure (MkT @"i82")
+    <*> pure (MkT @"i83")
+    <*> pure (MkT @"i84")
+    <*> pure (MkT @"i85")
+    <*> pure (MkT @"i86")
+    <*> pure (MkT @"i87")
+    <*> pure (MkT @"i88")
+    <*> pure (MkT @"i89")
diff --git a/test/Test/Size/Ap/Baseline/Baseline100.hs b/test/Test/Size/Ap/Baseline/Baseline100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Baseline/Baseline100.hs
@@ -0,0 +1,120 @@
+module Test.Size.Ap.Baseline.Baseline100 where
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix100
+
+applyF :: Applicative f => F r -> f r
+applyF f =
+        pure f
+        -- 00 .. 09
+    <*> pure (MkT @"i00")
+    <*> pure (MkT @"i01")
+    <*> pure (MkT @"i02")
+    <*> pure (MkT @"i03")
+    <*> pure (MkT @"i04")
+    <*> pure (MkT @"i05")
+    <*> pure (MkT @"i06")
+    <*> pure (MkT @"i07")
+    <*> pure (MkT @"i08")
+    <*> pure (MkT @"i09")
+        -- 10 .. 19
+    <*> pure (MkT @"i10")
+    <*> pure (MkT @"i11")
+    <*> pure (MkT @"i12")
+    <*> pure (MkT @"i13")
+    <*> pure (MkT @"i14")
+    <*> pure (MkT @"i15")
+    <*> pure (MkT @"i16")
+    <*> pure (MkT @"i17")
+    <*> pure (MkT @"i18")
+    <*> pure (MkT @"i19")
+        -- 20 .. 29
+    <*> pure (MkT @"i20")
+    <*> pure (MkT @"i21")
+    <*> pure (MkT @"i22")
+    <*> pure (MkT @"i23")
+    <*> pure (MkT @"i24")
+    <*> pure (MkT @"i25")
+    <*> pure (MkT @"i26")
+    <*> pure (MkT @"i27")
+    <*> pure (MkT @"i28")
+    <*> pure (MkT @"i29")
+        -- 30 .. 39
+    <*> pure (MkT @"i30")
+    <*> pure (MkT @"i31")
+    <*> pure (MkT @"i32")
+    <*> pure (MkT @"i33")
+    <*> pure (MkT @"i34")
+    <*> pure (MkT @"i35")
+    <*> pure (MkT @"i36")
+    <*> pure (MkT @"i37")
+    <*> pure (MkT @"i38")
+    <*> pure (MkT @"i39")
+        -- 40 .. 49
+    <*> pure (MkT @"i40")
+    <*> pure (MkT @"i41")
+    <*> pure (MkT @"i42")
+    <*> pure (MkT @"i43")
+    <*> pure (MkT @"i44")
+    <*> pure (MkT @"i45")
+    <*> pure (MkT @"i46")
+    <*> pure (MkT @"i47")
+    <*> pure (MkT @"i48")
+    <*> pure (MkT @"i49")
+        -- 50 .. 59
+    <*> pure (MkT @"i50")
+    <*> pure (MkT @"i51")
+    <*> pure (MkT @"i52")
+    <*> pure (MkT @"i53")
+    <*> pure (MkT @"i54")
+    <*> pure (MkT @"i55")
+    <*> pure (MkT @"i56")
+    <*> pure (MkT @"i57")
+    <*> pure (MkT @"i58")
+    <*> pure (MkT @"i59")
+        -- 60 .. 69
+    <*> pure (MkT @"i60")
+    <*> pure (MkT @"i61")
+    <*> pure (MkT @"i62")
+    <*> pure (MkT @"i63")
+    <*> pure (MkT @"i64")
+    <*> pure (MkT @"i65")
+    <*> pure (MkT @"i66")
+    <*> pure (MkT @"i67")
+    <*> pure (MkT @"i68")
+    <*> pure (MkT @"i69")
+        -- 70 .. 79
+    <*> pure (MkT @"i70")
+    <*> pure (MkT @"i71")
+    <*> pure (MkT @"i72")
+    <*> pure (MkT @"i73")
+    <*> pure (MkT @"i74")
+    <*> pure (MkT @"i75")
+    <*> pure (MkT @"i76")
+    <*> pure (MkT @"i77")
+    <*> pure (MkT @"i78")
+    <*> pure (MkT @"i79")
+        -- 80 .. 89
+    <*> pure (MkT @"i80")
+    <*> pure (MkT @"i81")
+    <*> pure (MkT @"i82")
+    <*> pure (MkT @"i83")
+    <*> pure (MkT @"i84")
+    <*> pure (MkT @"i85")
+    <*> pure (MkT @"i86")
+    <*> pure (MkT @"i87")
+    <*> pure (MkT @"i88")
+    <*> pure (MkT @"i89")
+        -- 90 .. 99
+    <*> pure (MkT @"i90")
+    <*> pure (MkT @"i91")
+    <*> pure (MkT @"i92")
+    <*> pure (MkT @"i93")
+    <*> pure (MkT @"i94")
+    <*> pure (MkT @"i95")
+    <*> pure (MkT @"i96")
+    <*> pure (MkT @"i97")
+    <*> pure (MkT @"i98")
+    <*> pure (MkT @"i99")
+
+
diff --git a/test/Test/Size/Ap/Index/Ix010.hs b/test/Test/Size/Ap/Index/Ix010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix010.hs
@@ -0,0 +1,17 @@
+module Test.Size.Ap.Index.Ix010 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix020.hs b/test/Test/Size/Ap/Index/Ix020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix020.hs
@@ -0,0 +1,28 @@
+module Test.Size.Ap.Index.Ix020 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix030.hs b/test/Test/Size/Ap/Index/Ix030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix030.hs
@@ -0,0 +1,39 @@
+module Test.Size.Ap.Index.Ix030 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix040.hs b/test/Test/Size/Ap/Index/Ix040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix040.hs
@@ -0,0 +1,50 @@
+module Test.Size.Ap.Index.Ix040 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix050.hs b/test/Test/Size/Ap/Index/Ix050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix050.hs
@@ -0,0 +1,61 @@
+module Test.Size.Ap.Index.Ix050 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+       -- 40 .. 49
+    -> T "i40"
+    -> T "i41"
+    -> T "i42"
+    -> T "i43"
+    -> T "i44"
+    -> T "i45"
+    -> T "i46"
+    -> T "i47"
+    -> T "i48"
+    -> T "i49"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix060.hs b/test/Test/Size/Ap/Index/Ix060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix060.hs
@@ -0,0 +1,72 @@
+module Test.Size.Ap.Index.Ix060 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+       -- 40 .. 49
+    -> T "i40"
+    -> T "i41"
+    -> T "i42"
+    -> T "i43"
+    -> T "i44"
+    -> T "i45"
+    -> T "i46"
+    -> T "i47"
+    -> T "i48"
+    -> T "i49"
+       -- 50 .. 59
+    -> T "i50"
+    -> T "i51"
+    -> T "i52"
+    -> T "i53"
+    -> T "i54"
+    -> T "i55"
+    -> T "i56"
+    -> T "i57"
+    -> T "i58"
+    -> T "i59"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix070.hs b/test/Test/Size/Ap/Index/Ix070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix070.hs
@@ -0,0 +1,83 @@
+module Test.Size.Ap.Index.Ix070 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+       -- 40 .. 49
+    -> T "i40"
+    -> T "i41"
+    -> T "i42"
+    -> T "i43"
+    -> T "i44"
+    -> T "i45"
+    -> T "i46"
+    -> T "i47"
+    -> T "i48"
+    -> T "i49"
+       -- 50 .. 59
+    -> T "i50"
+    -> T "i51"
+    -> T "i52"
+    -> T "i53"
+    -> T "i54"
+    -> T "i55"
+    -> T "i56"
+    -> T "i57"
+    -> T "i58"
+    -> T "i59"
+       -- 60 .. 69
+    -> T "i60"
+    -> T "i61"
+    -> T "i62"
+    -> T "i63"
+    -> T "i64"
+    -> T "i65"
+    -> T "i66"
+    -> T "i67"
+    -> T "i68"
+    -> T "i69"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix080.hs b/test/Test/Size/Ap/Index/Ix080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix080.hs
@@ -0,0 +1,94 @@
+module Test.Size.Ap.Index.Ix080 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+       -- 40 .. 49
+    -> T "i40"
+    -> T "i41"
+    -> T "i42"
+    -> T "i43"
+    -> T "i44"
+    -> T "i45"
+    -> T "i46"
+    -> T "i47"
+    -> T "i48"
+    -> T "i49"
+       -- 50 .. 59
+    -> T "i50"
+    -> T "i51"
+    -> T "i52"
+    -> T "i53"
+    -> T "i54"
+    -> T "i55"
+    -> T "i56"
+    -> T "i57"
+    -> T "i58"
+    -> T "i59"
+       -- 60 .. 69
+    -> T "i60"
+    -> T "i61"
+    -> T "i62"
+    -> T "i63"
+    -> T "i64"
+    -> T "i65"
+    -> T "i66"
+    -> T "i67"
+    -> T "i68"
+    -> T "i69"
+       -- 70 .. 79
+    -> T "i70"
+    -> T "i71"
+    -> T "i72"
+    -> T "i73"
+    -> T "i74"
+    -> T "i75"
+    -> T "i76"
+    -> T "i77"
+    -> T "i78"
+    -> T "i79"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix090.hs b/test/Test/Size/Ap/Index/Ix090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix090.hs
@@ -0,0 +1,105 @@
+module Test.Size.Ap.Index.Ix090 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+       -- 40 .. 49
+    -> T "i40"
+    -> T "i41"
+    -> T "i42"
+    -> T "i43"
+    -> T "i44"
+    -> T "i45"
+    -> T "i46"
+    -> T "i47"
+    -> T "i48"
+    -> T "i49"
+       -- 50 .. 59
+    -> T "i50"
+    -> T "i51"
+    -> T "i52"
+    -> T "i53"
+    -> T "i54"
+    -> T "i55"
+    -> T "i56"
+    -> T "i57"
+    -> T "i58"
+    -> T "i59"
+       -- 60 .. 69
+    -> T "i60"
+    -> T "i61"
+    -> T "i62"
+    -> T "i63"
+    -> T "i64"
+    -> T "i65"
+    -> T "i66"
+    -> T "i67"
+    -> T "i68"
+    -> T "i69"
+       -- 70 .. 79
+    -> T "i70"
+    -> T "i71"
+    -> T "i72"
+    -> T "i73"
+    -> T "i74"
+    -> T "i75"
+    -> T "i76"
+    -> T "i77"
+    -> T "i78"
+    -> T "i79"
+       -- 80 .. 89
+    -> T "i80"
+    -> T "i81"
+    -> T "i82"
+    -> T "i83"
+    -> T "i84"
+    -> T "i85"
+    -> T "i86"
+    -> T "i87"
+    -> T "i88"
+    -> T "i89"
+    -> r
diff --git a/test/Test/Size/Ap/Index/Ix100.hs b/test/Test/Size/Ap/Index/Ix100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Index/Ix100.hs
@@ -0,0 +1,116 @@
+module Test.Size.Ap.Index.Ix100 (F) where
+
+import Test.Infra
+
+type F r =
+       -- 00 .. 09
+       T "i00"
+    -> T "i01"
+    -> T "i02"
+    -> T "i03"
+    -> T "i04"
+    -> T "i05"
+    -> T "i06"
+    -> T "i07"
+    -> T "i08"
+    -> T "i09"
+       -- 10 .. 19
+    -> T "i10"
+    -> T "i11"
+    -> T "i12"
+    -> T "i13"
+    -> T "i14"
+    -> T "i15"
+    -> T "i16"
+    -> T "i17"
+    -> T "i18"
+    -> T "i19"
+       -- 20 .. 29
+    -> T "i20"
+    -> T "i21"
+    -> T "i22"
+    -> T "i23"
+    -> T "i24"
+    -> T "i25"
+    -> T "i26"
+    -> T "i27"
+    -> T "i28"
+    -> T "i29"
+       -- 30 .. 39
+    -> T "i30"
+    -> T "i31"
+    -> T "i32"
+    -> T "i33"
+    -> T "i34"
+    -> T "i35"
+    -> T "i36"
+    -> T "i37"
+    -> T "i38"
+    -> T "i39"
+       -- 40 .. 49
+    -> T "i40"
+    -> T "i41"
+    -> T "i42"
+    -> T "i43"
+    -> T "i44"
+    -> T "i45"
+    -> T "i46"
+    -> T "i47"
+    -> T "i48"
+    -> T "i49"
+       -- 50 .. 59
+    -> T "i50"
+    -> T "i51"
+    -> T "i52"
+    -> T "i53"
+    -> T "i54"
+    -> T "i55"
+    -> T "i56"
+    -> T "i57"
+    -> T "i58"
+    -> T "i59"
+       -- 60 .. 69
+    -> T "i60"
+    -> T "i61"
+    -> T "i62"
+    -> T "i63"
+    -> T "i64"
+    -> T "i65"
+    -> T "i66"
+    -> T "i67"
+    -> T "i68"
+    -> T "i69"
+       -- 70 .. 79
+    -> T "i70"
+    -> T "i71"
+    -> T "i72"
+    -> T "i73"
+    -> T "i74"
+    -> T "i75"
+    -> T "i76"
+    -> T "i77"
+    -> T "i78"
+    -> T "i79"
+       -- 80 .. 89
+    -> T "i80"
+    -> T "i81"
+    -> T "i82"
+    -> T "i83"
+    -> T "i84"
+    -> T "i85"
+    -> T "i86"
+    -> T "i87"
+    -> T "i88"
+    -> T "i89"
+       -- 90 .. 99
+    -> T "i90"
+    -> T "i91"
+    -> T "i92"
+    -> T "i93"
+    -> T "i94"
+    -> T "i95"
+    -> T "i96"
+    -> T "i97"
+    -> T "i98"
+    -> T "i99"
+    -> r
diff --git a/test/Test/Size/Ap/Let/Let010.hs b/test/Test/Size/Ap/Let/Let010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let010.hs
@@ -0,0 +1,54 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let010 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix010
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> r))   of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+
+          res = castEqual f09 <*> pure (MkT @"i09")
+
+      in res
+
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let020.hs b/test/Test/Size/Ap/Let/Let020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let020.hs
@@ -0,0 +1,88 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let020 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix020
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> r))   of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+
+          res = castEqual f19 <*> pure (MkT @"i19")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let030.hs b/test/Test/Size/Ap/Let/Let030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let030.hs
@@ -0,0 +1,122 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let030 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix030
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> r))   of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+
+          res = castEqual f29 <*> pure (MkT @"i29")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let040.hs b/test/Test/Size/Ap/Let/Let040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let040.hs
@@ -0,0 +1,156 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let040 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix040
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> r))   of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+
+          res = castEqual f39 <*> pure (MkT @"i39")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let050.hs b/test/Test/Size/Ap/Let/Let050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let050.hs
@@ -0,0 +1,190 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let050 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix050
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 49 .. 40
+    case letT (Proxy @(T "i49" -> r))   of { LetT (_ :: Proxy l49) ->
+    case letT (Proxy @(T "i48" -> l49)) of { LetT (_ :: Proxy l48) ->
+    case letT (Proxy @(T "i47" -> l48)) of { LetT (_ :: Proxy l47) ->
+    case letT (Proxy @(T "i46" -> l47)) of { LetT (_ :: Proxy l46) ->
+    case letT (Proxy @(T "i45" -> l46)) of { LetT (_ :: Proxy l45) ->
+    case letT (Proxy @(T "i44" -> l45)) of { LetT (_ :: Proxy l44) ->
+    case letT (Proxy @(T "i43" -> l44)) of { LetT (_ :: Proxy l43) ->
+    case letT (Proxy @(T "i42" -> l43)) of { LetT (_ :: Proxy l42) ->
+    case letT (Proxy @(T "i41" -> l42)) of { LetT (_ :: Proxy l41) ->
+    case letT (Proxy @(T "i40" -> l41)) of { LetT (_ :: Proxy l40) ->
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> l40)) of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+          -- 40 .. 49
+          f40 :: f l40
+          f41 :: f l41
+          f42 :: f l42
+          f43 :: f l43
+          f44 :: f l44
+          f45 :: f l45
+          f46 :: f l46
+          f47 :: f l47
+          f48 :: f l48
+          f49 :: f l49
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+          -- 40 .. 49
+          f40 = castEqual f39 <*> pure (MkT @"i39")
+          f41 = castEqual f40 <*> pure (MkT @"i40")
+          f42 = castEqual f41 <*> pure (MkT @"i41")
+          f43 = castEqual f42 <*> pure (MkT @"i42")
+          f44 = castEqual f43 <*> pure (MkT @"i43")
+          f45 = castEqual f44 <*> pure (MkT @"i44")
+          f46 = castEqual f45 <*> pure (MkT @"i45")
+          f47 = castEqual f46 <*> pure (MkT @"i46")
+          f48 = castEqual f47 <*> pure (MkT @"i47")
+          f49 = castEqual f48 <*> pure (MkT @"i48")
+
+          res = castEqual f49 <*> pure (MkT @"i49")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let060.hs b/test/Test/Size/Ap/Let/Let060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let060.hs
@@ -0,0 +1,224 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let060 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix060
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 59 .. 50
+    case letT (Proxy @(T "i59" -> r))   of { LetT (_ :: Proxy l59) ->
+    case letT (Proxy @(T "i58" -> l59)) of { LetT (_ :: Proxy l58) ->
+    case letT (Proxy @(T "i57" -> l58)) of { LetT (_ :: Proxy l57) ->
+    case letT (Proxy @(T "i56" -> l57)) of { LetT (_ :: Proxy l56) ->
+    case letT (Proxy @(T "i55" -> l56)) of { LetT (_ :: Proxy l55) ->
+    case letT (Proxy @(T "i54" -> l55)) of { LetT (_ :: Proxy l54) ->
+    case letT (Proxy @(T "i53" -> l54)) of { LetT (_ :: Proxy l53) ->
+    case letT (Proxy @(T "i52" -> l53)) of { LetT (_ :: Proxy l52) ->
+    case letT (Proxy @(T "i51" -> l52)) of { LetT (_ :: Proxy l51) ->
+    case letT (Proxy @(T "i50" -> l51)) of { LetT (_ :: Proxy l50) ->
+    -- 49 .. 40
+    case letT (Proxy @(T "i49" -> l50)) of { LetT (_ :: Proxy l49) ->
+    case letT (Proxy @(T "i48" -> l49)) of { LetT (_ :: Proxy l48) ->
+    case letT (Proxy @(T "i47" -> l48)) of { LetT (_ :: Proxy l47) ->
+    case letT (Proxy @(T "i46" -> l47)) of { LetT (_ :: Proxy l46) ->
+    case letT (Proxy @(T "i45" -> l46)) of { LetT (_ :: Proxy l45) ->
+    case letT (Proxy @(T "i44" -> l45)) of { LetT (_ :: Proxy l44) ->
+    case letT (Proxy @(T "i43" -> l44)) of { LetT (_ :: Proxy l43) ->
+    case letT (Proxy @(T "i42" -> l43)) of { LetT (_ :: Proxy l42) ->
+    case letT (Proxy @(T "i41" -> l42)) of { LetT (_ :: Proxy l41) ->
+    case letT (Proxy @(T "i40" -> l41)) of { LetT (_ :: Proxy l40) ->
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> l40)) of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+          -- 40 .. 49
+          f40 :: f l40
+          f41 :: f l41
+          f42 :: f l42
+          f43 :: f l43
+          f44 :: f l44
+          f45 :: f l45
+          f46 :: f l46
+          f47 :: f l47
+          f48 :: f l48
+          f49 :: f l49
+          -- 50 .. 59
+          f50 :: f l50
+          f51 :: f l51
+          f52 :: f l52
+          f53 :: f l53
+          f54 :: f l54
+          f55 :: f l55
+          f56 :: f l56
+          f57 :: f l57
+          f58 :: f l58
+          f59 :: f l59
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+          -- 40 .. 49
+          f40 = castEqual f39 <*> pure (MkT @"i39")
+          f41 = castEqual f40 <*> pure (MkT @"i40")
+          f42 = castEqual f41 <*> pure (MkT @"i41")
+          f43 = castEqual f42 <*> pure (MkT @"i42")
+          f44 = castEqual f43 <*> pure (MkT @"i43")
+          f45 = castEqual f44 <*> pure (MkT @"i44")
+          f46 = castEqual f45 <*> pure (MkT @"i45")
+          f47 = castEqual f46 <*> pure (MkT @"i46")
+          f48 = castEqual f47 <*> pure (MkT @"i47")
+          f49 = castEqual f48 <*> pure (MkT @"i48")
+          -- 50 .. 59
+          f50 = castEqual f49 <*> pure (MkT @"i49")
+          f51 = castEqual f50 <*> pure (MkT @"i50")
+          f52 = castEqual f51 <*> pure (MkT @"i51")
+          f53 = castEqual f52 <*> pure (MkT @"i52")
+          f54 = castEqual f53 <*> pure (MkT @"i53")
+          f55 = castEqual f54 <*> pure (MkT @"i54")
+          f56 = castEqual f55 <*> pure (MkT @"i55")
+          f57 = castEqual f56 <*> pure (MkT @"i56")
+          f58 = castEqual f57 <*> pure (MkT @"i57")
+          f59 = castEqual f58 <*> pure (MkT @"i58")
+
+          res = castEqual f59 <*> pure (MkT @"i59")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let070.hs b/test/Test/Size/Ap/Let/Let070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let070.hs
@@ -0,0 +1,258 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let070 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix070
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 69 .. 60
+    case letT (Proxy @(T "i69" -> r))   of { LetT (_ :: Proxy l69) ->
+    case letT (Proxy @(T "i68" -> l69)) of { LetT (_ :: Proxy l68) ->
+    case letT (Proxy @(T "i67" -> l68)) of { LetT (_ :: Proxy l67) ->
+    case letT (Proxy @(T "i66" -> l67)) of { LetT (_ :: Proxy l66) ->
+    case letT (Proxy @(T "i65" -> l66)) of { LetT (_ :: Proxy l65) ->
+    case letT (Proxy @(T "i64" -> l65)) of { LetT (_ :: Proxy l64) ->
+    case letT (Proxy @(T "i63" -> l64)) of { LetT (_ :: Proxy l63) ->
+    case letT (Proxy @(T "i62" -> l63)) of { LetT (_ :: Proxy l62) ->
+    case letT (Proxy @(T "i61" -> l62)) of { LetT (_ :: Proxy l61) ->
+    case letT (Proxy @(T "i60" -> l61)) of { LetT (_ :: Proxy l60) ->
+    -- 59 .. 50
+    case letT (Proxy @(T "i59" -> l60)) of { LetT (_ :: Proxy l59) ->
+    case letT (Proxy @(T "i58" -> l59)) of { LetT (_ :: Proxy l58) ->
+    case letT (Proxy @(T "i57" -> l58)) of { LetT (_ :: Proxy l57) ->
+    case letT (Proxy @(T "i56" -> l57)) of { LetT (_ :: Proxy l56) ->
+    case letT (Proxy @(T "i55" -> l56)) of { LetT (_ :: Proxy l55) ->
+    case letT (Proxy @(T "i54" -> l55)) of { LetT (_ :: Proxy l54) ->
+    case letT (Proxy @(T "i53" -> l54)) of { LetT (_ :: Proxy l53) ->
+    case letT (Proxy @(T "i52" -> l53)) of { LetT (_ :: Proxy l52) ->
+    case letT (Proxy @(T "i51" -> l52)) of { LetT (_ :: Proxy l51) ->
+    case letT (Proxy @(T "i50" -> l51)) of { LetT (_ :: Proxy l50) ->
+    -- 49 .. 40
+    case letT (Proxy @(T "i49" -> l50)) of { LetT (_ :: Proxy l49) ->
+    case letT (Proxy @(T "i48" -> l49)) of { LetT (_ :: Proxy l48) ->
+    case letT (Proxy @(T "i47" -> l48)) of { LetT (_ :: Proxy l47) ->
+    case letT (Proxy @(T "i46" -> l47)) of { LetT (_ :: Proxy l46) ->
+    case letT (Proxy @(T "i45" -> l46)) of { LetT (_ :: Proxy l45) ->
+    case letT (Proxy @(T "i44" -> l45)) of { LetT (_ :: Proxy l44) ->
+    case letT (Proxy @(T "i43" -> l44)) of { LetT (_ :: Proxy l43) ->
+    case letT (Proxy @(T "i42" -> l43)) of { LetT (_ :: Proxy l42) ->
+    case letT (Proxy @(T "i41" -> l42)) of { LetT (_ :: Proxy l41) ->
+    case letT (Proxy @(T "i40" -> l41)) of { LetT (_ :: Proxy l40) ->
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> l40)) of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+          -- 40 .. 49
+          f40 :: f l40
+          f41 :: f l41
+          f42 :: f l42
+          f43 :: f l43
+          f44 :: f l44
+          f45 :: f l45
+          f46 :: f l46
+          f47 :: f l47
+          f48 :: f l48
+          f49 :: f l49
+          -- 50 .. 59
+          f50 :: f l50
+          f51 :: f l51
+          f52 :: f l52
+          f53 :: f l53
+          f54 :: f l54
+          f55 :: f l55
+          f56 :: f l56
+          f57 :: f l57
+          f58 :: f l58
+          f59 :: f l59
+          -- 60 .. 69
+          f60 :: f l60
+          f61 :: f l61
+          f62 :: f l62
+          f63 :: f l63
+          f64 :: f l64
+          f65 :: f l65
+          f66 :: f l66
+          f67 :: f l67
+          f68 :: f l68
+          f69 :: f l69
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+          -- 40 .. 49
+          f40 = castEqual f39 <*> pure (MkT @"i39")
+          f41 = castEqual f40 <*> pure (MkT @"i40")
+          f42 = castEqual f41 <*> pure (MkT @"i41")
+          f43 = castEqual f42 <*> pure (MkT @"i42")
+          f44 = castEqual f43 <*> pure (MkT @"i43")
+          f45 = castEqual f44 <*> pure (MkT @"i44")
+          f46 = castEqual f45 <*> pure (MkT @"i45")
+          f47 = castEqual f46 <*> pure (MkT @"i46")
+          f48 = castEqual f47 <*> pure (MkT @"i47")
+          f49 = castEqual f48 <*> pure (MkT @"i48")
+          -- 50 .. 59
+          f50 = castEqual f49 <*> pure (MkT @"i49")
+          f51 = castEqual f50 <*> pure (MkT @"i50")
+          f52 = castEqual f51 <*> pure (MkT @"i51")
+          f53 = castEqual f52 <*> pure (MkT @"i52")
+          f54 = castEqual f53 <*> pure (MkT @"i53")
+          f55 = castEqual f54 <*> pure (MkT @"i54")
+          f56 = castEqual f55 <*> pure (MkT @"i55")
+          f57 = castEqual f56 <*> pure (MkT @"i56")
+          f58 = castEqual f57 <*> pure (MkT @"i57")
+          f59 = castEqual f58 <*> pure (MkT @"i58")
+          -- 60 .. 69
+          f60 = castEqual f59 <*> pure (MkT @"i59")
+          f61 = castEqual f60 <*> pure (MkT @"i60")
+          f62 = castEqual f61 <*> pure (MkT @"i61")
+          f63 = castEqual f62 <*> pure (MkT @"i62")
+          f64 = castEqual f63 <*> pure (MkT @"i63")
+          f65 = castEqual f64 <*> pure (MkT @"i64")
+          f66 = castEqual f65 <*> pure (MkT @"i65")
+          f67 = castEqual f66 <*> pure (MkT @"i66")
+          f68 = castEqual f67 <*> pure (MkT @"i67")
+          f69 = castEqual f68 <*> pure (MkT @"i68")
+
+          res = castEqual f69 <*> pure (MkT @"i69")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let080.hs b/test/Test/Size/Ap/Let/Let080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let080.hs
@@ -0,0 +1,292 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let080 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix080
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 79 .. 70
+    case letT (Proxy @(T "i79" -> r))   of { LetT (_ :: Proxy l79) ->
+    case letT (Proxy @(T "i78" -> l79)) of { LetT (_ :: Proxy l78) ->
+    case letT (Proxy @(T "i77" -> l78)) of { LetT (_ :: Proxy l77) ->
+    case letT (Proxy @(T "i76" -> l77)) of { LetT (_ :: Proxy l76) ->
+    case letT (Proxy @(T "i75" -> l76)) of { LetT (_ :: Proxy l75) ->
+    case letT (Proxy @(T "i74" -> l75)) of { LetT (_ :: Proxy l74) ->
+    case letT (Proxy @(T "i73" -> l74)) of { LetT (_ :: Proxy l73) ->
+    case letT (Proxy @(T "i72" -> l73)) of { LetT (_ :: Proxy l72) ->
+    case letT (Proxy @(T "i71" -> l72)) of { LetT (_ :: Proxy l71) ->
+    case letT (Proxy @(T "i70" -> l71)) of { LetT (_ :: Proxy l70) ->
+    -- 69 .. 60
+    case letT (Proxy @(T "i69" -> l70)) of { LetT (_ :: Proxy l69) ->
+    case letT (Proxy @(T "i68" -> l69)) of { LetT (_ :: Proxy l68) ->
+    case letT (Proxy @(T "i67" -> l68)) of { LetT (_ :: Proxy l67) ->
+    case letT (Proxy @(T "i66" -> l67)) of { LetT (_ :: Proxy l66) ->
+    case letT (Proxy @(T "i65" -> l66)) of { LetT (_ :: Proxy l65) ->
+    case letT (Proxy @(T "i64" -> l65)) of { LetT (_ :: Proxy l64) ->
+    case letT (Proxy @(T "i63" -> l64)) of { LetT (_ :: Proxy l63) ->
+    case letT (Proxy @(T "i62" -> l63)) of { LetT (_ :: Proxy l62) ->
+    case letT (Proxy @(T "i61" -> l62)) of { LetT (_ :: Proxy l61) ->
+    case letT (Proxy @(T "i60" -> l61)) of { LetT (_ :: Proxy l60) ->
+    -- 59 .. 50
+    case letT (Proxy @(T "i59" -> l60)) of { LetT (_ :: Proxy l59) ->
+    case letT (Proxy @(T "i58" -> l59)) of { LetT (_ :: Proxy l58) ->
+    case letT (Proxy @(T "i57" -> l58)) of { LetT (_ :: Proxy l57) ->
+    case letT (Proxy @(T "i56" -> l57)) of { LetT (_ :: Proxy l56) ->
+    case letT (Proxy @(T "i55" -> l56)) of { LetT (_ :: Proxy l55) ->
+    case letT (Proxy @(T "i54" -> l55)) of { LetT (_ :: Proxy l54) ->
+    case letT (Proxy @(T "i53" -> l54)) of { LetT (_ :: Proxy l53) ->
+    case letT (Proxy @(T "i52" -> l53)) of { LetT (_ :: Proxy l52) ->
+    case letT (Proxy @(T "i51" -> l52)) of { LetT (_ :: Proxy l51) ->
+    case letT (Proxy @(T "i50" -> l51)) of { LetT (_ :: Proxy l50) ->
+    -- 49 .. 40
+    case letT (Proxy @(T "i49" -> l50)) of { LetT (_ :: Proxy l49) ->
+    case letT (Proxy @(T "i48" -> l49)) of { LetT (_ :: Proxy l48) ->
+    case letT (Proxy @(T "i47" -> l48)) of { LetT (_ :: Proxy l47) ->
+    case letT (Proxy @(T "i46" -> l47)) of { LetT (_ :: Proxy l46) ->
+    case letT (Proxy @(T "i45" -> l46)) of { LetT (_ :: Proxy l45) ->
+    case letT (Proxy @(T "i44" -> l45)) of { LetT (_ :: Proxy l44) ->
+    case letT (Proxy @(T "i43" -> l44)) of { LetT (_ :: Proxy l43) ->
+    case letT (Proxy @(T "i42" -> l43)) of { LetT (_ :: Proxy l42) ->
+    case letT (Proxy @(T "i41" -> l42)) of { LetT (_ :: Proxy l41) ->
+    case letT (Proxy @(T "i40" -> l41)) of { LetT (_ :: Proxy l40) ->
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> l40)) of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+          -- 40 .. 49
+          f40 :: f l40
+          f41 :: f l41
+          f42 :: f l42
+          f43 :: f l43
+          f44 :: f l44
+          f45 :: f l45
+          f46 :: f l46
+          f47 :: f l47
+          f48 :: f l48
+          f49 :: f l49
+          -- 50 .. 59
+          f50 :: f l50
+          f51 :: f l51
+          f52 :: f l52
+          f53 :: f l53
+          f54 :: f l54
+          f55 :: f l55
+          f56 :: f l56
+          f57 :: f l57
+          f58 :: f l58
+          f59 :: f l59
+          -- 60 .. 69
+          f60 :: f l60
+          f61 :: f l61
+          f62 :: f l62
+          f63 :: f l63
+          f64 :: f l64
+          f65 :: f l65
+          f66 :: f l66
+          f67 :: f l67
+          f68 :: f l68
+          f69 :: f l69
+          -- 70 .. 79
+          f70 :: f l70
+          f71 :: f l71
+          f72 :: f l72
+          f73 :: f l73
+          f74 :: f l74
+          f75 :: f l75
+          f76 :: f l76
+          f77 :: f l77
+          f78 :: f l78
+          f79 :: f l79
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+          -- 40 .. 49
+          f40 = castEqual f39 <*> pure (MkT @"i39")
+          f41 = castEqual f40 <*> pure (MkT @"i40")
+          f42 = castEqual f41 <*> pure (MkT @"i41")
+          f43 = castEqual f42 <*> pure (MkT @"i42")
+          f44 = castEqual f43 <*> pure (MkT @"i43")
+          f45 = castEqual f44 <*> pure (MkT @"i44")
+          f46 = castEqual f45 <*> pure (MkT @"i45")
+          f47 = castEqual f46 <*> pure (MkT @"i46")
+          f48 = castEqual f47 <*> pure (MkT @"i47")
+          f49 = castEqual f48 <*> pure (MkT @"i48")
+          -- 50 .. 59
+          f50 = castEqual f49 <*> pure (MkT @"i49")
+          f51 = castEqual f50 <*> pure (MkT @"i50")
+          f52 = castEqual f51 <*> pure (MkT @"i51")
+          f53 = castEqual f52 <*> pure (MkT @"i52")
+          f54 = castEqual f53 <*> pure (MkT @"i53")
+          f55 = castEqual f54 <*> pure (MkT @"i54")
+          f56 = castEqual f55 <*> pure (MkT @"i55")
+          f57 = castEqual f56 <*> pure (MkT @"i56")
+          f58 = castEqual f57 <*> pure (MkT @"i57")
+          f59 = castEqual f58 <*> pure (MkT @"i58")
+          -- 60 .. 69
+          f60 = castEqual f59 <*> pure (MkT @"i59")
+          f61 = castEqual f60 <*> pure (MkT @"i60")
+          f62 = castEqual f61 <*> pure (MkT @"i61")
+          f63 = castEqual f62 <*> pure (MkT @"i62")
+          f64 = castEqual f63 <*> pure (MkT @"i63")
+          f65 = castEqual f64 <*> pure (MkT @"i64")
+          f66 = castEqual f65 <*> pure (MkT @"i65")
+          f67 = castEqual f66 <*> pure (MkT @"i66")
+          f68 = castEqual f67 <*> pure (MkT @"i67")
+          f69 = castEqual f68 <*> pure (MkT @"i68")
+          -- 70 .. 79
+          f70 = castEqual f69 <*> pure (MkT @"i69")
+          f71 = castEqual f70 <*> pure (MkT @"i70")
+          f72 = castEqual f71 <*> pure (MkT @"i71")
+          f73 = castEqual f72 <*> pure (MkT @"i72")
+          f74 = castEqual f73 <*> pure (MkT @"i73")
+          f75 = castEqual f74 <*> pure (MkT @"i74")
+          f76 = castEqual f75 <*> pure (MkT @"i75")
+          f77 = castEqual f76 <*> pure (MkT @"i76")
+          f78 = castEqual f77 <*> pure (MkT @"i77")
+          f79 = castEqual f78 <*> pure (MkT @"i78")
+
+          res = castEqual f79 <*> pure (MkT @"i79")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let090.hs b/test/Test/Size/Ap/Let/Let090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let090.hs
@@ -0,0 +1,326 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let090 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix090
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 89 .. 80
+    case letT (Proxy @(T "i89" -> r))   of { LetT (_ :: Proxy l89) ->
+    case letT (Proxy @(T "i88" -> l89)) of { LetT (_ :: Proxy l88) ->
+    case letT (Proxy @(T "i87" -> l88)) of { LetT (_ :: Proxy l87) ->
+    case letT (Proxy @(T "i86" -> l87)) of { LetT (_ :: Proxy l86) ->
+    case letT (Proxy @(T "i85" -> l86)) of { LetT (_ :: Proxy l85) ->
+    case letT (Proxy @(T "i84" -> l85)) of { LetT (_ :: Proxy l84) ->
+    case letT (Proxy @(T "i83" -> l84)) of { LetT (_ :: Proxy l83) ->
+    case letT (Proxy @(T "i82" -> l83)) of { LetT (_ :: Proxy l82) ->
+    case letT (Proxy @(T "i81" -> l82)) of { LetT (_ :: Proxy l81) ->
+    case letT (Proxy @(T "i80" -> l81)) of { LetT (_ :: Proxy l80) ->
+    -- 79 .. 70
+    case letT (Proxy @(T "i79" -> l80)) of { LetT (_ :: Proxy l79) ->
+    case letT (Proxy @(T "i78" -> l79)) of { LetT (_ :: Proxy l78) ->
+    case letT (Proxy @(T "i77" -> l78)) of { LetT (_ :: Proxy l77) ->
+    case letT (Proxy @(T "i76" -> l77)) of { LetT (_ :: Proxy l76) ->
+    case letT (Proxy @(T "i75" -> l76)) of { LetT (_ :: Proxy l75) ->
+    case letT (Proxy @(T "i74" -> l75)) of { LetT (_ :: Proxy l74) ->
+    case letT (Proxy @(T "i73" -> l74)) of { LetT (_ :: Proxy l73) ->
+    case letT (Proxy @(T "i72" -> l73)) of { LetT (_ :: Proxy l72) ->
+    case letT (Proxy @(T "i71" -> l72)) of { LetT (_ :: Proxy l71) ->
+    case letT (Proxy @(T "i70" -> l71)) of { LetT (_ :: Proxy l70) ->
+    -- 69 .. 60
+    case letT (Proxy @(T "i69" -> l70)) of { LetT (_ :: Proxy l69) ->
+    case letT (Proxy @(T "i68" -> l69)) of { LetT (_ :: Proxy l68) ->
+    case letT (Proxy @(T "i67" -> l68)) of { LetT (_ :: Proxy l67) ->
+    case letT (Proxy @(T "i66" -> l67)) of { LetT (_ :: Proxy l66) ->
+    case letT (Proxy @(T "i65" -> l66)) of { LetT (_ :: Proxy l65) ->
+    case letT (Proxy @(T "i64" -> l65)) of { LetT (_ :: Proxy l64) ->
+    case letT (Proxy @(T "i63" -> l64)) of { LetT (_ :: Proxy l63) ->
+    case letT (Proxy @(T "i62" -> l63)) of { LetT (_ :: Proxy l62) ->
+    case letT (Proxy @(T "i61" -> l62)) of { LetT (_ :: Proxy l61) ->
+    case letT (Proxy @(T "i60" -> l61)) of { LetT (_ :: Proxy l60) ->
+    -- 59 .. 50
+    case letT (Proxy @(T "i59" -> l60)) of { LetT (_ :: Proxy l59) ->
+    case letT (Proxy @(T "i58" -> l59)) of { LetT (_ :: Proxy l58) ->
+    case letT (Proxy @(T "i57" -> l58)) of { LetT (_ :: Proxy l57) ->
+    case letT (Proxy @(T "i56" -> l57)) of { LetT (_ :: Proxy l56) ->
+    case letT (Proxy @(T "i55" -> l56)) of { LetT (_ :: Proxy l55) ->
+    case letT (Proxy @(T "i54" -> l55)) of { LetT (_ :: Proxy l54) ->
+    case letT (Proxy @(T "i53" -> l54)) of { LetT (_ :: Proxy l53) ->
+    case letT (Proxy @(T "i52" -> l53)) of { LetT (_ :: Proxy l52) ->
+    case letT (Proxy @(T "i51" -> l52)) of { LetT (_ :: Proxy l51) ->
+    case letT (Proxy @(T "i50" -> l51)) of { LetT (_ :: Proxy l50) ->
+    -- 49 .. 40
+    case letT (Proxy @(T "i49" -> l50)) of { LetT (_ :: Proxy l49) ->
+    case letT (Proxy @(T "i48" -> l49)) of { LetT (_ :: Proxy l48) ->
+    case letT (Proxy @(T "i47" -> l48)) of { LetT (_ :: Proxy l47) ->
+    case letT (Proxy @(T "i46" -> l47)) of { LetT (_ :: Proxy l46) ->
+    case letT (Proxy @(T "i45" -> l46)) of { LetT (_ :: Proxy l45) ->
+    case letT (Proxy @(T "i44" -> l45)) of { LetT (_ :: Proxy l44) ->
+    case letT (Proxy @(T "i43" -> l44)) of { LetT (_ :: Proxy l43) ->
+    case letT (Proxy @(T "i42" -> l43)) of { LetT (_ :: Proxy l42) ->
+    case letT (Proxy @(T "i41" -> l42)) of { LetT (_ :: Proxy l41) ->
+    case letT (Proxy @(T "i40" -> l41)) of { LetT (_ :: Proxy l40) ->
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> l40)) of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+          -- 40 .. 49
+          f40 :: f l40
+          f41 :: f l41
+          f42 :: f l42
+          f43 :: f l43
+          f44 :: f l44
+          f45 :: f l45
+          f46 :: f l46
+          f47 :: f l47
+          f48 :: f l48
+          f49 :: f l49
+          -- 50 .. 59
+          f50 :: f l50
+          f51 :: f l51
+          f52 :: f l52
+          f53 :: f l53
+          f54 :: f l54
+          f55 :: f l55
+          f56 :: f l56
+          f57 :: f l57
+          f58 :: f l58
+          f59 :: f l59
+          -- 60 .. 69
+          f60 :: f l60
+          f61 :: f l61
+          f62 :: f l62
+          f63 :: f l63
+          f64 :: f l64
+          f65 :: f l65
+          f66 :: f l66
+          f67 :: f l67
+          f68 :: f l68
+          f69 :: f l69
+          -- 70 .. 79
+          f70 :: f l70
+          f71 :: f l71
+          f72 :: f l72
+          f73 :: f l73
+          f74 :: f l74
+          f75 :: f l75
+          f76 :: f l76
+          f77 :: f l77
+          f78 :: f l78
+          f79 :: f l79
+          -- 80 .. 89
+          f80 :: f l80
+          f81 :: f l81
+          f82 :: f l82
+          f83 :: f l83
+          f84 :: f l84
+          f85 :: f l85
+          f86 :: f l86
+          f87 :: f l87
+          f88 :: f l88
+          f89 :: f l89
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+          -- 40 .. 49
+          f40 = castEqual f39 <*> pure (MkT @"i39")
+          f41 = castEqual f40 <*> pure (MkT @"i40")
+          f42 = castEqual f41 <*> pure (MkT @"i41")
+          f43 = castEqual f42 <*> pure (MkT @"i42")
+          f44 = castEqual f43 <*> pure (MkT @"i43")
+          f45 = castEqual f44 <*> pure (MkT @"i44")
+          f46 = castEqual f45 <*> pure (MkT @"i45")
+          f47 = castEqual f46 <*> pure (MkT @"i46")
+          f48 = castEqual f47 <*> pure (MkT @"i47")
+          f49 = castEqual f48 <*> pure (MkT @"i48")
+          -- 50 .. 59
+          f50 = castEqual f49 <*> pure (MkT @"i49")
+          f51 = castEqual f50 <*> pure (MkT @"i50")
+          f52 = castEqual f51 <*> pure (MkT @"i51")
+          f53 = castEqual f52 <*> pure (MkT @"i52")
+          f54 = castEqual f53 <*> pure (MkT @"i53")
+          f55 = castEqual f54 <*> pure (MkT @"i54")
+          f56 = castEqual f55 <*> pure (MkT @"i55")
+          f57 = castEqual f56 <*> pure (MkT @"i56")
+          f58 = castEqual f57 <*> pure (MkT @"i57")
+          f59 = castEqual f58 <*> pure (MkT @"i58")
+          -- 60 .. 69
+          f60 = castEqual f59 <*> pure (MkT @"i59")
+          f61 = castEqual f60 <*> pure (MkT @"i60")
+          f62 = castEqual f61 <*> pure (MkT @"i61")
+          f63 = castEqual f62 <*> pure (MkT @"i62")
+          f64 = castEqual f63 <*> pure (MkT @"i63")
+          f65 = castEqual f64 <*> pure (MkT @"i64")
+          f66 = castEqual f65 <*> pure (MkT @"i65")
+          f67 = castEqual f66 <*> pure (MkT @"i66")
+          f68 = castEqual f67 <*> pure (MkT @"i67")
+          f69 = castEqual f68 <*> pure (MkT @"i68")
+          -- 70 .. 79
+          f70 = castEqual f69 <*> pure (MkT @"i69")
+          f71 = castEqual f70 <*> pure (MkT @"i70")
+          f72 = castEqual f71 <*> pure (MkT @"i71")
+          f73 = castEqual f72 <*> pure (MkT @"i72")
+          f74 = castEqual f73 <*> pure (MkT @"i73")
+          f75 = castEqual f74 <*> pure (MkT @"i74")
+          f76 = castEqual f75 <*> pure (MkT @"i75")
+          f77 = castEqual f76 <*> pure (MkT @"i76")
+          f78 = castEqual f77 <*> pure (MkT @"i77")
+          f79 = castEqual f78 <*> pure (MkT @"i78")
+          -- 80 .. 89
+          f80 = castEqual f79 <*> pure (MkT @"i79")
+          f81 = castEqual f80 <*> pure (MkT @"i80")
+          f82 = castEqual f81 <*> pure (MkT @"i81")
+          f83 = castEqual f82 <*> pure (MkT @"i82")
+          f84 = castEqual f83 <*> pure (MkT @"i83")
+          f85 = castEqual f84 <*> pure (MkT @"i84")
+          f86 = castEqual f85 <*> pure (MkT @"i85")
+          f87 = castEqual f86 <*> pure (MkT @"i86")
+          f88 = castEqual f87 <*> pure (MkT @"i87")
+          f89 = castEqual f88 <*> pure (MkT @"i88")
+
+          res = castEqual f89 <*> pure (MkT @"i89")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/Ap/Let/Let100.hs b/test/Test/Size/Ap/Let/Let100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/Ap/Let/Let100.hs
@@ -0,0 +1,360 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.Ap.Let.Let100 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.Ap.Index.Ix100
+
+applyF :: forall f r. Applicative f => F r -> f r
+applyF f =
+    -- 99 .. 90
+    case letT (Proxy @(T "i99" -> r))   of { LetT (_ :: Proxy l99) ->
+    case letT (Proxy @(T "i98" -> l99)) of { LetT (_ :: Proxy l98) ->
+    case letT (Proxy @(T "i97" -> l98)) of { LetT (_ :: Proxy l97) ->
+    case letT (Proxy @(T "i96" -> l97)) of { LetT (_ :: Proxy l96) ->
+    case letT (Proxy @(T "i95" -> l96)) of { LetT (_ :: Proxy l95) ->
+    case letT (Proxy @(T "i94" -> l95)) of { LetT (_ :: Proxy l94) ->
+    case letT (Proxy @(T "i93" -> l94)) of { LetT (_ :: Proxy l93) ->
+    case letT (Proxy @(T "i92" -> l93)) of { LetT (_ :: Proxy l92) ->
+    case letT (Proxy @(T "i91" -> l92)) of { LetT (_ :: Proxy l91) ->
+    case letT (Proxy @(T "i90" -> l91)) of { LetT (_ :: Proxy l90) ->
+    -- 89 .. 80
+    case letT (Proxy @(T "i89" -> l90)) of { LetT (_ :: Proxy l89) ->
+    case letT (Proxy @(T "i88" -> l89)) of { LetT (_ :: Proxy l88) ->
+    case letT (Proxy @(T "i87" -> l88)) of { LetT (_ :: Proxy l87) ->
+    case letT (Proxy @(T "i86" -> l87)) of { LetT (_ :: Proxy l86) ->
+    case letT (Proxy @(T "i85" -> l86)) of { LetT (_ :: Proxy l85) ->
+    case letT (Proxy @(T "i84" -> l85)) of { LetT (_ :: Proxy l84) ->
+    case letT (Proxy @(T "i83" -> l84)) of { LetT (_ :: Proxy l83) ->
+    case letT (Proxy @(T "i82" -> l83)) of { LetT (_ :: Proxy l82) ->
+    case letT (Proxy @(T "i81" -> l82)) of { LetT (_ :: Proxy l81) ->
+    case letT (Proxy @(T "i80" -> l81)) of { LetT (_ :: Proxy l80) ->
+    -- 79 .. 70
+    case letT (Proxy @(T "i79" -> l80)) of { LetT (_ :: Proxy l79) ->
+    case letT (Proxy @(T "i78" -> l79)) of { LetT (_ :: Proxy l78) ->
+    case letT (Proxy @(T "i77" -> l78)) of { LetT (_ :: Proxy l77) ->
+    case letT (Proxy @(T "i76" -> l77)) of { LetT (_ :: Proxy l76) ->
+    case letT (Proxy @(T "i75" -> l76)) of { LetT (_ :: Proxy l75) ->
+    case letT (Proxy @(T "i74" -> l75)) of { LetT (_ :: Proxy l74) ->
+    case letT (Proxy @(T "i73" -> l74)) of { LetT (_ :: Proxy l73) ->
+    case letT (Proxy @(T "i72" -> l73)) of { LetT (_ :: Proxy l72) ->
+    case letT (Proxy @(T "i71" -> l72)) of { LetT (_ :: Proxy l71) ->
+    case letT (Proxy @(T "i70" -> l71)) of { LetT (_ :: Proxy l70) ->
+    -- 69 .. 60
+    case letT (Proxy @(T "i69" -> l70)) of { LetT (_ :: Proxy l69) ->
+    case letT (Proxy @(T "i68" -> l69)) of { LetT (_ :: Proxy l68) ->
+    case letT (Proxy @(T "i67" -> l68)) of { LetT (_ :: Proxy l67) ->
+    case letT (Proxy @(T "i66" -> l67)) of { LetT (_ :: Proxy l66) ->
+    case letT (Proxy @(T "i65" -> l66)) of { LetT (_ :: Proxy l65) ->
+    case letT (Proxy @(T "i64" -> l65)) of { LetT (_ :: Proxy l64) ->
+    case letT (Proxy @(T "i63" -> l64)) of { LetT (_ :: Proxy l63) ->
+    case letT (Proxy @(T "i62" -> l63)) of { LetT (_ :: Proxy l62) ->
+    case letT (Proxy @(T "i61" -> l62)) of { LetT (_ :: Proxy l61) ->
+    case letT (Proxy @(T "i60" -> l61)) of { LetT (_ :: Proxy l60) ->
+    -- 59 .. 50
+    case letT (Proxy @(T "i59" -> l60)) of { LetT (_ :: Proxy l59) ->
+    case letT (Proxy @(T "i58" -> l59)) of { LetT (_ :: Proxy l58) ->
+    case letT (Proxy @(T "i57" -> l58)) of { LetT (_ :: Proxy l57) ->
+    case letT (Proxy @(T "i56" -> l57)) of { LetT (_ :: Proxy l56) ->
+    case letT (Proxy @(T "i55" -> l56)) of { LetT (_ :: Proxy l55) ->
+    case letT (Proxy @(T "i54" -> l55)) of { LetT (_ :: Proxy l54) ->
+    case letT (Proxy @(T "i53" -> l54)) of { LetT (_ :: Proxy l53) ->
+    case letT (Proxy @(T "i52" -> l53)) of { LetT (_ :: Proxy l52) ->
+    case letT (Proxy @(T "i51" -> l52)) of { LetT (_ :: Proxy l51) ->
+    case letT (Proxy @(T "i50" -> l51)) of { LetT (_ :: Proxy l50) ->
+    -- 49 .. 40
+    case letT (Proxy @(T "i49" -> l50)) of { LetT (_ :: Proxy l49) ->
+    case letT (Proxy @(T "i48" -> l49)) of { LetT (_ :: Proxy l48) ->
+    case letT (Proxy @(T "i47" -> l48)) of { LetT (_ :: Proxy l47) ->
+    case letT (Proxy @(T "i46" -> l47)) of { LetT (_ :: Proxy l46) ->
+    case letT (Proxy @(T "i45" -> l46)) of { LetT (_ :: Proxy l45) ->
+    case letT (Proxy @(T "i44" -> l45)) of { LetT (_ :: Proxy l44) ->
+    case letT (Proxy @(T "i43" -> l44)) of { LetT (_ :: Proxy l43) ->
+    case letT (Proxy @(T "i42" -> l43)) of { LetT (_ :: Proxy l42) ->
+    case letT (Proxy @(T "i41" -> l42)) of { LetT (_ :: Proxy l41) ->
+    case letT (Proxy @(T "i40" -> l41)) of { LetT (_ :: Proxy l40) ->
+    -- 39 .. 30
+    case letT (Proxy @(T "i39" -> l40)) of { LetT (_ :: Proxy l39) ->
+    case letT (Proxy @(T "i38" -> l39)) of { LetT (_ :: Proxy l38) ->
+    case letT (Proxy @(T "i37" -> l38)) of { LetT (_ :: Proxy l37) ->
+    case letT (Proxy @(T "i36" -> l37)) of { LetT (_ :: Proxy l36) ->
+    case letT (Proxy @(T "i35" -> l36)) of { LetT (_ :: Proxy l35) ->
+    case letT (Proxy @(T "i34" -> l35)) of { LetT (_ :: Proxy l34) ->
+    case letT (Proxy @(T "i33" -> l34)) of { LetT (_ :: Proxy l33) ->
+    case letT (Proxy @(T "i32" -> l33)) of { LetT (_ :: Proxy l32) ->
+    case letT (Proxy @(T "i31" -> l32)) of { LetT (_ :: Proxy l31) ->
+    case letT (Proxy @(T "i30" -> l31)) of { LetT (_ :: Proxy l30) ->
+    -- 29 .. 20
+    case letT (Proxy @(T "i29" -> l30)) of { LetT (_ :: Proxy l29) ->
+    case letT (Proxy @(T "i28" -> l29)) of { LetT (_ :: Proxy l28) ->
+    case letT (Proxy @(T "i27" -> l28)) of { LetT (_ :: Proxy l27) ->
+    case letT (Proxy @(T "i26" -> l27)) of { LetT (_ :: Proxy l26) ->
+    case letT (Proxy @(T "i25" -> l26)) of { LetT (_ :: Proxy l25) ->
+    case letT (Proxy @(T "i24" -> l25)) of { LetT (_ :: Proxy l24) ->
+    case letT (Proxy @(T "i23" -> l24)) of { LetT (_ :: Proxy l23) ->
+    case letT (Proxy @(T "i22" -> l23)) of { LetT (_ :: Proxy l22) ->
+    case letT (Proxy @(T "i21" -> l22)) of { LetT (_ :: Proxy l21) ->
+    case letT (Proxy @(T "i20" -> l21)) of { LetT (_ :: Proxy l20) ->
+    -- 19 .. 10
+    case letT (Proxy @(T "i19" -> l20)) of { LetT (_ :: Proxy l19) ->
+    case letT (Proxy @(T "i18" -> l19)) of { LetT (_ :: Proxy l18) ->
+    case letT (Proxy @(T "i17" -> l18)) of { LetT (_ :: Proxy l17) ->
+    case letT (Proxy @(T "i16" -> l17)) of { LetT (_ :: Proxy l16) ->
+    case letT (Proxy @(T "i15" -> l16)) of { LetT (_ :: Proxy l15) ->
+    case letT (Proxy @(T "i14" -> l15)) of { LetT (_ :: Proxy l14) ->
+    case letT (Proxy @(T "i13" -> l14)) of { LetT (_ :: Proxy l13) ->
+    case letT (Proxy @(T "i12" -> l13)) of { LetT (_ :: Proxy l12) ->
+    case letT (Proxy @(T "i11" -> l12)) of { LetT (_ :: Proxy l11) ->
+    case letT (Proxy @(T "i10" -> l11)) of { LetT (_ :: Proxy l10) ->
+    -- 09 .. 00
+    case letT (Proxy @(T "i09" -> l10)) of { LetT (_ :: Proxy l09) ->
+    case letT (Proxy @(T "i08" -> l09)) of { LetT (_ :: Proxy l08) ->
+    case letT (Proxy @(T "i07" -> l08)) of { LetT (_ :: Proxy l07) ->
+    case letT (Proxy @(T "i06" -> l07)) of { LetT (_ :: Proxy l06) ->
+    case letT (Proxy @(T "i05" -> l06)) of { LetT (_ :: Proxy l05) ->
+    case letT (Proxy @(T "i04" -> l05)) of { LetT (_ :: Proxy l04) ->
+    case letT (Proxy @(T "i03" -> l04)) of { LetT (_ :: Proxy l03) ->
+    case letT (Proxy @(T "i02" -> l03)) of { LetT (_ :: Proxy l02) ->
+    case letT (Proxy @(T "i01" -> l02)) of { LetT (_ :: Proxy l01) ->
+    case letT (Proxy @(T "i00" -> l01)) of { LetT (_ :: Proxy l00) ->
+
+      let -- 00 .. 09
+          f00 :: f l00
+          f01 :: f l01
+          f02 :: f l02
+          f03 :: f l03
+          f04 :: f l04
+          f05 :: f l05
+          f06 :: f l06
+          f07 :: f l07
+          f08 :: f l08
+          f09 :: f l09
+          -- 10 .. 19
+          f10 :: f l10
+          f11 :: f l11
+          f12 :: f l12
+          f13 :: f l13
+          f14 :: f l14
+          f15 :: f l15
+          f16 :: f l16
+          f17 :: f l17
+          f18 :: f l18
+          f19 :: f l19
+          -- 20 .. 29
+          f20 :: f l20
+          f21 :: f l21
+          f22 :: f l22
+          f23 :: f l23
+          f24 :: f l24
+          f25 :: f l25
+          f26 :: f l26
+          f27 :: f l27
+          f28 :: f l28
+          f29 :: f l29
+          -- 30 .. 39
+          f30 :: f l30
+          f31 :: f l31
+          f32 :: f l32
+          f33 :: f l33
+          f34 :: f l34
+          f35 :: f l35
+          f36 :: f l36
+          f37 :: f l37
+          f38 :: f l38
+          f39 :: f l39
+          -- 40 .. 49
+          f40 :: f l40
+          f41 :: f l41
+          f42 :: f l42
+          f43 :: f l43
+          f44 :: f l44
+          f45 :: f l45
+          f46 :: f l46
+          f47 :: f l47
+          f48 :: f l48
+          f49 :: f l49
+          -- 50 .. 59
+          f50 :: f l50
+          f51 :: f l51
+          f52 :: f l52
+          f53 :: f l53
+          f54 :: f l54
+          f55 :: f l55
+          f56 :: f l56
+          f57 :: f l57
+          f58 :: f l58
+          f59 :: f l59
+          -- 60 .. 69
+          f60 :: f l60
+          f61 :: f l61
+          f62 :: f l62
+          f63 :: f l63
+          f64 :: f l64
+          f65 :: f l65
+          f66 :: f l66
+          f67 :: f l67
+          f68 :: f l68
+          f69 :: f l69
+          -- 70 .. 79
+          f70 :: f l70
+          f71 :: f l71
+          f72 :: f l72
+          f73 :: f l73
+          f74 :: f l74
+          f75 :: f l75
+          f76 :: f l76
+          f77 :: f l77
+          f78 :: f l78
+          f79 :: f l79
+          -- 80 .. 89
+          f80 :: f l80
+          f81 :: f l81
+          f82 :: f l82
+          f83 :: f l83
+          f84 :: f l84
+          f85 :: f l85
+          f86 :: f l86
+          f87 :: f l87
+          f88 :: f l88
+          f89 :: f l89
+          -- 90 .. 99
+          f90 :: f l90
+          f91 :: f l91
+          f92 :: f l92
+          f93 :: f l93
+          f94 :: f l94
+          f95 :: f l95
+          f96 :: f l96
+          f97 :: f l97
+          f98 :: f l98
+          f99 :: f l99
+
+          res :: f r
+
+          -- 00 .. 09
+          f00 = pure (castEqual f)
+          f01 = castEqual f00 <*> pure (MkT @"i00")
+          f02 = castEqual f01 <*> pure (MkT @"i01")
+          f03 = castEqual f02 <*> pure (MkT @"i02")
+          f04 = castEqual f03 <*> pure (MkT @"i03")
+          f05 = castEqual f04 <*> pure (MkT @"i04")
+          f06 = castEqual f05 <*> pure (MkT @"i05")
+          f07 = castEqual f06 <*> pure (MkT @"i06")
+          f08 = castEqual f07 <*> pure (MkT @"i07")
+          f09 = castEqual f08 <*> pure (MkT @"i08")
+          -- 10 .. 19
+          f10 = castEqual f09 <*> pure (MkT @"i09")
+          f11 = castEqual f10 <*> pure (MkT @"i10")
+          f12 = castEqual f11 <*> pure (MkT @"i11")
+          f13 = castEqual f12 <*> pure (MkT @"i12")
+          f14 = castEqual f13 <*> pure (MkT @"i13")
+          f15 = castEqual f14 <*> pure (MkT @"i14")
+          f16 = castEqual f15 <*> pure (MkT @"i15")
+          f17 = castEqual f16 <*> pure (MkT @"i16")
+          f18 = castEqual f17 <*> pure (MkT @"i17")
+          f19 = castEqual f18 <*> pure (MkT @"i18")
+          -- 20 .. 29
+          f20 = castEqual f19 <*> pure (MkT @"i19")
+          f21 = castEqual f20 <*> pure (MkT @"i20")
+          f22 = castEqual f21 <*> pure (MkT @"i21")
+          f23 = castEqual f22 <*> pure (MkT @"i22")
+          f24 = castEqual f23 <*> pure (MkT @"i23")
+          f25 = castEqual f24 <*> pure (MkT @"i24")
+          f26 = castEqual f25 <*> pure (MkT @"i25")
+          f27 = castEqual f26 <*> pure (MkT @"i26")
+          f28 = castEqual f27 <*> pure (MkT @"i27")
+          f29 = castEqual f28 <*> pure (MkT @"i28")
+          -- 30 .. 39
+          f30 = castEqual f29 <*> pure (MkT @"i29")
+          f31 = castEqual f30 <*> pure (MkT @"i30")
+          f32 = castEqual f31 <*> pure (MkT @"i31")
+          f33 = castEqual f32 <*> pure (MkT @"i32")
+          f34 = castEqual f33 <*> pure (MkT @"i33")
+          f35 = castEqual f34 <*> pure (MkT @"i34")
+          f36 = castEqual f35 <*> pure (MkT @"i35")
+          f37 = castEqual f36 <*> pure (MkT @"i36")
+          f38 = castEqual f37 <*> pure (MkT @"i37")
+          f39 = castEqual f38 <*> pure (MkT @"i38")
+          -- 40 .. 49
+          f40 = castEqual f39 <*> pure (MkT @"i39")
+          f41 = castEqual f40 <*> pure (MkT @"i40")
+          f42 = castEqual f41 <*> pure (MkT @"i41")
+          f43 = castEqual f42 <*> pure (MkT @"i42")
+          f44 = castEqual f43 <*> pure (MkT @"i43")
+          f45 = castEqual f44 <*> pure (MkT @"i44")
+          f46 = castEqual f45 <*> pure (MkT @"i45")
+          f47 = castEqual f46 <*> pure (MkT @"i46")
+          f48 = castEqual f47 <*> pure (MkT @"i47")
+          f49 = castEqual f48 <*> pure (MkT @"i48")
+          -- 50 .. 59
+          f50 = castEqual f49 <*> pure (MkT @"i49")
+          f51 = castEqual f50 <*> pure (MkT @"i50")
+          f52 = castEqual f51 <*> pure (MkT @"i51")
+          f53 = castEqual f52 <*> pure (MkT @"i52")
+          f54 = castEqual f53 <*> pure (MkT @"i53")
+          f55 = castEqual f54 <*> pure (MkT @"i54")
+          f56 = castEqual f55 <*> pure (MkT @"i55")
+          f57 = castEqual f56 <*> pure (MkT @"i56")
+          f58 = castEqual f57 <*> pure (MkT @"i57")
+          f59 = castEqual f58 <*> pure (MkT @"i58")
+          -- 60 .. 69
+          f60 = castEqual f59 <*> pure (MkT @"i59")
+          f61 = castEqual f60 <*> pure (MkT @"i60")
+          f62 = castEqual f61 <*> pure (MkT @"i61")
+          f63 = castEqual f62 <*> pure (MkT @"i62")
+          f64 = castEqual f63 <*> pure (MkT @"i63")
+          f65 = castEqual f64 <*> pure (MkT @"i64")
+          f66 = castEqual f65 <*> pure (MkT @"i65")
+          f67 = castEqual f66 <*> pure (MkT @"i66")
+          f68 = castEqual f67 <*> pure (MkT @"i67")
+          f69 = castEqual f68 <*> pure (MkT @"i68")
+          -- 70 .. 79
+          f70 = castEqual f69 <*> pure (MkT @"i69")
+          f71 = castEqual f70 <*> pure (MkT @"i70")
+          f72 = castEqual f71 <*> pure (MkT @"i71")
+          f73 = castEqual f72 <*> pure (MkT @"i72")
+          f74 = castEqual f73 <*> pure (MkT @"i73")
+          f75 = castEqual f74 <*> pure (MkT @"i74")
+          f76 = castEqual f75 <*> pure (MkT @"i75")
+          f77 = castEqual f76 <*> pure (MkT @"i76")
+          f78 = castEqual f77 <*> pure (MkT @"i77")
+          f79 = castEqual f78 <*> pure (MkT @"i78")
+          -- 80 .. 89
+          f80 = castEqual f79 <*> pure (MkT @"i79")
+          f81 = castEqual f80 <*> pure (MkT @"i80")
+          f82 = castEqual f81 <*> pure (MkT @"i81")
+          f83 = castEqual f82 <*> pure (MkT @"i82")
+          f84 = castEqual f83 <*> pure (MkT @"i83")
+          f85 = castEqual f84 <*> pure (MkT @"i84")
+          f86 = castEqual f85 <*> pure (MkT @"i85")
+          f87 = castEqual f86 <*> pure (MkT @"i86")
+          f88 = castEqual f87 <*> pure (MkT @"i87")
+          f89 = castEqual f88 <*> pure (MkT @"i88")
+          -- 90 .. 99
+          f90 = castEqual f89 <*> pure (MkT @"i89")
+          f91 = castEqual f90 <*> pure (MkT @"i90")
+          f92 = castEqual f91 <*> pure (MkT @"i91")
+          f93 = castEqual f92 <*> pure (MkT @"i92")
+          f94 = castEqual f93 <*> pure (MkT @"i93")
+          f95 = castEqual f94 <*> pure (MkT @"i94")
+          f96 = castEqual f95 <*> pure (MkT @"i95")
+          f97 = castEqual f96 <*> pure (MkT @"i96")
+          f98 = castEqual f97 <*> pure (MkT @"i97")
+          f99 = castEqual f98 <*> pure (MkT @"i98")
+
+          res = castEqual f99 <*> pure (MkT @"i99")
+
+      in res
+
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/Baseline/Baseline010.hs b/test/Test/Size/HList/Baseline/Baseline010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline010.hs
@@ -0,0 +1,20 @@
+module Test.Size.HList.Baseline.Baseline010 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix010
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline020.hs b/test/Test/Size/HList/Baseline/Baseline020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline020.hs
@@ -0,0 +1,31 @@
+module Test.Size.HList.Baseline.Baseline020 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix020
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline030.hs b/test/Test/Size/HList/Baseline/Baseline030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline030.hs
@@ -0,0 +1,42 @@
+module Test.Size.HList.Baseline.Baseline030 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix030
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline040.hs b/test/Test/Size/HList/Baseline/Baseline040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline040.hs
@@ -0,0 +1,53 @@
+module Test.Size.HList.Baseline.Baseline040 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix040
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline050.hs b/test/Test/Size/HList/Baseline/Baseline050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline050.hs
@@ -0,0 +1,64 @@
+module Test.Size.HList.Baseline.Baseline050 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix050
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+      -- 40 .. 49
+    $ HCons (MkT @"i40")
+    $ HCons (MkT @"i41")
+    $ HCons (MkT @"i42")
+    $ HCons (MkT @"i43")
+    $ HCons (MkT @"i44")
+    $ HCons (MkT @"i45")
+    $ HCons (MkT @"i46")
+    $ HCons (MkT @"i47")
+    $ HCons (MkT @"i48")
+    $ HCons (MkT @"i49")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline060.hs b/test/Test/Size/HList/Baseline/Baseline060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline060.hs
@@ -0,0 +1,75 @@
+module Test.Size.HList.Baseline.Baseline060 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix060
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+      -- 40 .. 49
+    $ HCons (MkT @"i40")
+    $ HCons (MkT @"i41")
+    $ HCons (MkT @"i42")
+    $ HCons (MkT @"i43")
+    $ HCons (MkT @"i44")
+    $ HCons (MkT @"i45")
+    $ HCons (MkT @"i46")
+    $ HCons (MkT @"i47")
+    $ HCons (MkT @"i48")
+    $ HCons (MkT @"i49")
+      -- 50 .. 59
+    $ HCons (MkT @"i50")
+    $ HCons (MkT @"i51")
+    $ HCons (MkT @"i52")
+    $ HCons (MkT @"i53")
+    $ HCons (MkT @"i54")
+    $ HCons (MkT @"i55")
+    $ HCons (MkT @"i56")
+    $ HCons (MkT @"i57")
+    $ HCons (MkT @"i58")
+    $ HCons (MkT @"i59")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline070.hs b/test/Test/Size/HList/Baseline/Baseline070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline070.hs
@@ -0,0 +1,86 @@
+module Test.Size.HList.Baseline.Baseline070 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix070
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+      -- 40 .. 49
+    $ HCons (MkT @"i40")
+    $ HCons (MkT @"i41")
+    $ HCons (MkT @"i42")
+    $ HCons (MkT @"i43")
+    $ HCons (MkT @"i44")
+    $ HCons (MkT @"i45")
+    $ HCons (MkT @"i46")
+    $ HCons (MkT @"i47")
+    $ HCons (MkT @"i48")
+    $ HCons (MkT @"i49")
+      -- 50 .. 59
+    $ HCons (MkT @"i50")
+    $ HCons (MkT @"i51")
+    $ HCons (MkT @"i52")
+    $ HCons (MkT @"i53")
+    $ HCons (MkT @"i54")
+    $ HCons (MkT @"i55")
+    $ HCons (MkT @"i56")
+    $ HCons (MkT @"i57")
+    $ HCons (MkT @"i58")
+    $ HCons (MkT @"i59")
+      -- 60 .. 69
+    $ HCons (MkT @"i60")
+    $ HCons (MkT @"i61")
+    $ HCons (MkT @"i62")
+    $ HCons (MkT @"i63")
+    $ HCons (MkT @"i64")
+    $ HCons (MkT @"i65")
+    $ HCons (MkT @"i66")
+    $ HCons (MkT @"i67")
+    $ HCons (MkT @"i68")
+    $ HCons (MkT @"i69")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline080.hs b/test/Test/Size/HList/Baseline/Baseline080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline080.hs
@@ -0,0 +1,97 @@
+module Test.Size.HList.Baseline.Baseline080 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix080
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+      -- 40 .. 49
+    $ HCons (MkT @"i40")
+    $ HCons (MkT @"i41")
+    $ HCons (MkT @"i42")
+    $ HCons (MkT @"i43")
+    $ HCons (MkT @"i44")
+    $ HCons (MkT @"i45")
+    $ HCons (MkT @"i46")
+    $ HCons (MkT @"i47")
+    $ HCons (MkT @"i48")
+    $ HCons (MkT @"i49")
+      -- 50 .. 59
+    $ HCons (MkT @"i50")
+    $ HCons (MkT @"i51")
+    $ HCons (MkT @"i52")
+    $ HCons (MkT @"i53")
+    $ HCons (MkT @"i54")
+    $ HCons (MkT @"i55")
+    $ HCons (MkT @"i56")
+    $ HCons (MkT @"i57")
+    $ HCons (MkT @"i58")
+    $ HCons (MkT @"i59")
+      -- 60 .. 69
+    $ HCons (MkT @"i60")
+    $ HCons (MkT @"i61")
+    $ HCons (MkT @"i62")
+    $ HCons (MkT @"i63")
+    $ HCons (MkT @"i64")
+    $ HCons (MkT @"i65")
+    $ HCons (MkT @"i66")
+    $ HCons (MkT @"i67")
+    $ HCons (MkT @"i68")
+    $ HCons (MkT @"i69")
+      -- 70 .. 79
+    $ HCons (MkT @"i70")
+    $ HCons (MkT @"i71")
+    $ HCons (MkT @"i72")
+    $ HCons (MkT @"i73")
+    $ HCons (MkT @"i74")
+    $ HCons (MkT @"i75")
+    $ HCons (MkT @"i76")
+    $ HCons (MkT @"i77")
+    $ HCons (MkT @"i78")
+    $ HCons (MkT @"i79")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline090.hs b/test/Test/Size/HList/Baseline/Baseline090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline090.hs
@@ -0,0 +1,108 @@
+module Test.Size.HList.Baseline.Baseline090 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix090
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+      -- 40 .. 49
+    $ HCons (MkT @"i40")
+    $ HCons (MkT @"i41")
+    $ HCons (MkT @"i42")
+    $ HCons (MkT @"i43")
+    $ HCons (MkT @"i44")
+    $ HCons (MkT @"i45")
+    $ HCons (MkT @"i46")
+    $ HCons (MkT @"i47")
+    $ HCons (MkT @"i48")
+    $ HCons (MkT @"i49")
+      -- 50 .. 59
+    $ HCons (MkT @"i50")
+    $ HCons (MkT @"i51")
+    $ HCons (MkT @"i52")
+    $ HCons (MkT @"i53")
+    $ HCons (MkT @"i54")
+    $ HCons (MkT @"i55")
+    $ HCons (MkT @"i56")
+    $ HCons (MkT @"i57")
+    $ HCons (MkT @"i58")
+    $ HCons (MkT @"i59")
+      -- 60 .. 69
+    $ HCons (MkT @"i60")
+    $ HCons (MkT @"i61")
+    $ HCons (MkT @"i62")
+    $ HCons (MkT @"i63")
+    $ HCons (MkT @"i64")
+    $ HCons (MkT @"i65")
+    $ HCons (MkT @"i66")
+    $ HCons (MkT @"i67")
+    $ HCons (MkT @"i68")
+    $ HCons (MkT @"i69")
+      -- 70 .. 79
+    $ HCons (MkT @"i70")
+    $ HCons (MkT @"i71")
+    $ HCons (MkT @"i72")
+    $ HCons (MkT @"i73")
+    $ HCons (MkT @"i74")
+    $ HCons (MkT @"i75")
+    $ HCons (MkT @"i76")
+    $ HCons (MkT @"i77")
+    $ HCons (MkT @"i78")
+    $ HCons (MkT @"i79")
+      -- 80 .. 89
+    $ HCons (MkT @"i80")
+    $ HCons (MkT @"i81")
+    $ HCons (MkT @"i82")
+    $ HCons (MkT @"i83")
+    $ HCons (MkT @"i84")
+    $ HCons (MkT @"i85")
+    $ HCons (MkT @"i86")
+    $ HCons (MkT @"i87")
+    $ HCons (MkT @"i88")
+    $ HCons (MkT @"i89")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Baseline/Baseline100.hs b/test/Test/Size/HList/Baseline/Baseline100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Baseline/Baseline100.hs
@@ -0,0 +1,119 @@
+module Test.Size.HList.Baseline.Baseline100 where
+
+import Test.Infra
+import Test.Size.HList.Index.Ix100
+
+hlist :: HList Fields
+hlist =
+      -- 00 .. 09
+      HCons (MkT @"i00")
+    $ HCons (MkT @"i01")
+    $ HCons (MkT @"i02")
+    $ HCons (MkT @"i03")
+    $ HCons (MkT @"i04")
+    $ HCons (MkT @"i05")
+    $ HCons (MkT @"i06")
+    $ HCons (MkT @"i07")
+    $ HCons (MkT @"i08")
+    $ HCons (MkT @"i09")
+      -- 10 .. 19
+    $ HCons (MkT @"i10")
+    $ HCons (MkT @"i11")
+    $ HCons (MkT @"i12")
+    $ HCons (MkT @"i13")
+    $ HCons (MkT @"i14")
+    $ HCons (MkT @"i15")
+    $ HCons (MkT @"i16")
+    $ HCons (MkT @"i17")
+    $ HCons (MkT @"i18")
+    $ HCons (MkT @"i19")
+      -- 20 .. 29
+    $ HCons (MkT @"i20")
+    $ HCons (MkT @"i21")
+    $ HCons (MkT @"i22")
+    $ HCons (MkT @"i23")
+    $ HCons (MkT @"i24")
+    $ HCons (MkT @"i25")
+    $ HCons (MkT @"i26")
+    $ HCons (MkT @"i27")
+    $ HCons (MkT @"i28")
+    $ HCons (MkT @"i29")
+      -- 30 .. 39
+    $ HCons (MkT @"i30")
+    $ HCons (MkT @"i31")
+    $ HCons (MkT @"i32")
+    $ HCons (MkT @"i33")
+    $ HCons (MkT @"i34")
+    $ HCons (MkT @"i35")
+    $ HCons (MkT @"i36")
+    $ HCons (MkT @"i37")
+    $ HCons (MkT @"i38")
+    $ HCons (MkT @"i39")
+      -- 40 .. 49
+    $ HCons (MkT @"i40")
+    $ HCons (MkT @"i41")
+    $ HCons (MkT @"i42")
+    $ HCons (MkT @"i43")
+    $ HCons (MkT @"i44")
+    $ HCons (MkT @"i45")
+    $ HCons (MkT @"i46")
+    $ HCons (MkT @"i47")
+    $ HCons (MkT @"i48")
+    $ HCons (MkT @"i49")
+      -- 50 .. 59
+    $ HCons (MkT @"i50")
+    $ HCons (MkT @"i51")
+    $ HCons (MkT @"i52")
+    $ HCons (MkT @"i53")
+    $ HCons (MkT @"i54")
+    $ HCons (MkT @"i55")
+    $ HCons (MkT @"i56")
+    $ HCons (MkT @"i57")
+    $ HCons (MkT @"i58")
+    $ HCons (MkT @"i59")
+      -- 60 .. 69
+    $ HCons (MkT @"i60")
+    $ HCons (MkT @"i61")
+    $ HCons (MkT @"i62")
+    $ HCons (MkT @"i63")
+    $ HCons (MkT @"i64")
+    $ HCons (MkT @"i65")
+    $ HCons (MkT @"i66")
+    $ HCons (MkT @"i67")
+    $ HCons (MkT @"i68")
+    $ HCons (MkT @"i69")
+      -- 70 .. 79
+    $ HCons (MkT @"i70")
+    $ HCons (MkT @"i71")
+    $ HCons (MkT @"i72")
+    $ HCons (MkT @"i73")
+    $ HCons (MkT @"i74")
+    $ HCons (MkT @"i75")
+    $ HCons (MkT @"i76")
+    $ HCons (MkT @"i77")
+    $ HCons (MkT @"i78")
+    $ HCons (MkT @"i79")
+      -- 80 .. 89
+    $ HCons (MkT @"i80")
+    $ HCons (MkT @"i81")
+    $ HCons (MkT @"i82")
+    $ HCons (MkT @"i83")
+    $ HCons (MkT @"i84")
+    $ HCons (MkT @"i85")
+    $ HCons (MkT @"i86")
+    $ HCons (MkT @"i87")
+    $ HCons (MkT @"i88")
+    $ HCons (MkT @"i89")
+      -- 90 .. 99
+    $ HCons (MkT @"i90")
+    $ HCons (MkT @"i91")
+    $ HCons (MkT @"i92")
+    $ HCons (MkT @"i93")
+    $ HCons (MkT @"i94")
+    $ HCons (MkT @"i95")
+    $ HCons (MkT @"i96")
+    $ HCons (MkT @"i97")
+    $ HCons (MkT @"i98")
+    $ HCons (MkT @"i99")
+    $ HNil
+
diff --git a/test/Test/Size/HList/Index/Ix010.hs b/test/Test/Size/HList/Index/Ix010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix010.hs
@@ -0,0 +1,17 @@
+module Test.Size.HList.Index.Ix010 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix020.hs b/test/Test/Size/HList/Index/Ix020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix020.hs
@@ -0,0 +1,28 @@
+module Test.Size.HList.Index.Ix020 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix030.hs b/test/Test/Size/HList/Index/Ix030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix030.hs
@@ -0,0 +1,39 @@
+module Test.Size.HList.Index.Ix030 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix040.hs b/test/Test/Size/HList/Index/Ix040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix040.hs
@@ -0,0 +1,50 @@
+module Test.Size.HList.Index.Ix040 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix050.hs b/test/Test/Size/HList/Index/Ix050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix050.hs
@@ -0,0 +1,61 @@
+module Test.Size.HList.Index.Ix050 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+      -- 40 .. 49
+    , T "i40"
+    , T "i41"
+    , T "i42"
+    , T "i43"
+    , T "i44"
+    , T "i45"
+    , T "i46"
+    , T "i47"
+    , T "i48"
+    , T "i49"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix060.hs b/test/Test/Size/HList/Index/Ix060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix060.hs
@@ -0,0 +1,72 @@
+module Test.Size.HList.Index.Ix060 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+      -- 40 .. 49
+    , T "i40"
+    , T "i41"
+    , T "i42"
+    , T "i43"
+    , T "i44"
+    , T "i45"
+    , T "i46"
+    , T "i47"
+    , T "i48"
+    , T "i49"
+      -- 50 .. 59
+    , T "i50"
+    , T "i51"
+    , T "i52"
+    , T "i53"
+    , T "i54"
+    , T "i55"
+    , T "i56"
+    , T "i57"
+    , T "i58"
+    , T "i59"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix070.hs b/test/Test/Size/HList/Index/Ix070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix070.hs
@@ -0,0 +1,83 @@
+module Test.Size.HList.Index.Ix070 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+      -- 40 .. 49
+    , T "i40"
+    , T "i41"
+    , T "i42"
+    , T "i43"
+    , T "i44"
+    , T "i45"
+    , T "i46"
+    , T "i47"
+    , T "i48"
+    , T "i49"
+      -- 50 .. 59
+    , T "i50"
+    , T "i51"
+    , T "i52"
+    , T "i53"
+    , T "i54"
+    , T "i55"
+    , T "i56"
+    , T "i57"
+    , T "i58"
+    , T "i59"
+      -- 60 .. 69
+    , T "i60"
+    , T "i61"
+    , T "i62"
+    , T "i63"
+    , T "i64"
+    , T "i65"
+    , T "i66"
+    , T "i67"
+    , T "i68"
+    , T "i69"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix080.hs b/test/Test/Size/HList/Index/Ix080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix080.hs
@@ -0,0 +1,94 @@
+module Test.Size.HList.Index.Ix080 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+      -- 40 .. 49
+    , T "i40"
+    , T "i41"
+    , T "i42"
+    , T "i43"
+    , T "i44"
+    , T "i45"
+    , T "i46"
+    , T "i47"
+    , T "i48"
+    , T "i49"
+      -- 50 .. 59
+    , T "i50"
+    , T "i51"
+    , T "i52"
+    , T "i53"
+    , T "i54"
+    , T "i55"
+    , T "i56"
+    , T "i57"
+    , T "i58"
+    , T "i59"
+      -- 60 .. 69
+    , T "i60"
+    , T "i61"
+    , T "i62"
+    , T "i63"
+    , T "i64"
+    , T "i65"
+    , T "i66"
+    , T "i67"
+    , T "i68"
+    , T "i69"
+      -- 70 .. 79
+    , T "i70"
+    , T "i71"
+    , T "i72"
+    , T "i73"
+    , T "i74"
+    , T "i75"
+    , T "i76"
+    , T "i77"
+    , T "i78"
+    , T "i79"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix090.hs b/test/Test/Size/HList/Index/Ix090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix090.hs
@@ -0,0 +1,105 @@
+module Test.Size.HList.Index.Ix090 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+      -- 40 .. 49
+    , T "i40"
+    , T "i41"
+    , T "i42"
+    , T "i43"
+    , T "i44"
+    , T "i45"
+    , T "i46"
+    , T "i47"
+    , T "i48"
+    , T "i49"
+      -- 50 .. 59
+    , T "i50"
+    , T "i51"
+    , T "i52"
+    , T "i53"
+    , T "i54"
+    , T "i55"
+    , T "i56"
+    , T "i57"
+    , T "i58"
+    , T "i59"
+      -- 60 .. 69
+    , T "i60"
+    , T "i61"
+    , T "i62"
+    , T "i63"
+    , T "i64"
+    , T "i65"
+    , T "i66"
+    , T "i67"
+    , T "i68"
+    , T "i69"
+      -- 70 .. 79
+    , T "i70"
+    , T "i71"
+    , T "i72"
+    , T "i73"
+    , T "i74"
+    , T "i75"
+    , T "i76"
+    , T "i77"
+    , T "i78"
+    , T "i79"
+      -- 80 .. 89
+    , T "i80"
+    , T "i81"
+    , T "i82"
+    , T "i83"
+    , T "i84"
+    , T "i85"
+    , T "i86"
+    , T "i87"
+    , T "i88"
+    , T "i89"
+    ]
diff --git a/test/Test/Size/HList/Index/Ix100.hs b/test/Test/Size/HList/Index/Ix100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/Index/Ix100.hs
@@ -0,0 +1,116 @@
+module Test.Size.HList.Index.Ix100 (Fields) where
+
+import Test.Infra
+
+type Fields = '[
+      -- 00 .. 09
+      T "i00"
+    , T "i01"
+    , T "i02"
+    , T "i03"
+    , T "i04"
+    , T "i05"
+    , T "i06"
+    , T "i07"
+    , T "i08"
+    , T "i09"
+      -- 10 .. 19
+    , T "i10"
+    , T "i11"
+    , T "i12"
+    , T "i13"
+    , T "i14"
+    , T "i15"
+    , T "i16"
+    , T "i17"
+    , T "i18"
+    , T "i19"
+      -- 20 .. 29
+    , T "i20"
+    , T "i21"
+    , T "i22"
+    , T "i23"
+    , T "i24"
+    , T "i25"
+    , T "i26"
+    , T "i27"
+    , T "i28"
+    , T "i29"
+      -- 30 .. 39
+    , T "i30"
+    , T "i31"
+    , T "i32"
+    , T "i33"
+    , T "i34"
+    , T "i35"
+    , T "i36"
+    , T "i37"
+    , T "i38"
+    , T "i39"
+      -- 40 .. 49
+    , T "i40"
+    , T "i41"
+    , T "i42"
+    , T "i43"
+    , T "i44"
+    , T "i45"
+    , T "i46"
+    , T "i47"
+    , T "i48"
+    , T "i49"
+      -- 50 .. 59
+    , T "i50"
+    , T "i51"
+    , T "i52"
+    , T "i53"
+    , T "i54"
+    , T "i55"
+    , T "i56"
+    , T "i57"
+    , T "i58"
+    , T "i59"
+      -- 60 .. 69
+    , T "i60"
+    , T "i61"
+    , T "i62"
+    , T "i63"
+    , T "i64"
+    , T "i65"
+    , T "i66"
+    , T "i67"
+    , T "i68"
+    , T "i69"
+      -- 70 .. 79
+    , T "i70"
+    , T "i71"
+    , T "i72"
+    , T "i73"
+    , T "i74"
+    , T "i75"
+    , T "i76"
+    , T "i77"
+    , T "i78"
+    , T "i79"
+      -- 80 .. 89
+    , T "i80"
+    , T "i81"
+    , T "i82"
+    , T "i83"
+    , T "i84"
+    , T "i85"
+    , T "i86"
+    , T "i87"
+    , T "i88"
+    , T "i89"
+      -- 90 .. 99
+    , T "i90"
+    , T "i91"
+    , T "i92"
+    , T "i93"
+    , T "i94"
+    , T "i95"
+    , T "i96"
+    , T "i97"
+    , T "i98"
+    , T "i99"
+    ]
diff --git a/test/Test/Size/HList/LetAs/LetAs010.hs b/test/Test/Size/HList/LetAs/LetAs010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs010.hs
@@ -0,0 +1,24 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs010 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix010
+
+hlist :: HList Fields
+hlist =
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") HNil) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs020.hs b/test/Test/Size/HList/LetAs/LetAs020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs020.hs
@@ -0,0 +1,36 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs020 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix020
+
+hlist :: HList Fields
+hlist =
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") HNil) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs030.hs b/test/Test/Size/HList/LetAs/LetAs030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs030.hs
@@ -0,0 +1,48 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs030 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix030
+
+hlist :: HList Fields
+hlist =
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") HNil) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs040.hs b/test/Test/Size/HList/LetAs/LetAs040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs040.hs
@@ -0,0 +1,60 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs040 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix040
+
+hlist :: HList Fields
+hlist =
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") HNil) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs050.hs b/test/Test/Size/HList/LetAs/LetAs050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs050.hs
@@ -0,0 +1,72 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs050 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix050
+
+hlist :: HList Fields
+hlist =
+    -- 49 .. 40
+    case letAs (HCons (MkT @"i49") HNil) of { LetAs (xs49 :: HList t49) ->
+    case letAs (HCons (MkT @"i48") xs49) of { LetAs (xs48 :: HList t48) ->
+    case letAs (HCons (MkT @"i47") xs48) of { LetAs (xs47 :: HList t47) ->
+    case letAs (HCons (MkT @"i46") xs47) of { LetAs (xs46 :: HList t46) ->
+    case letAs (HCons (MkT @"i45") xs46) of { LetAs (xs45 :: HList t45) ->
+    case letAs (HCons (MkT @"i44") xs45) of { LetAs (xs44 :: HList t44) ->
+    case letAs (HCons (MkT @"i43") xs44) of { LetAs (xs43 :: HList t43) ->
+    case letAs (HCons (MkT @"i42") xs43) of { LetAs (xs42 :: HList t42) ->
+    case letAs (HCons (MkT @"i41") xs42) of { LetAs (xs41 :: HList t41) ->
+    case letAs (HCons (MkT @"i40") xs41) of { LetAs (xs40 :: HList t40) ->
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") xs40) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs060.hs b/test/Test/Size/HList/LetAs/LetAs060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs060.hs
@@ -0,0 +1,84 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs060 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix060
+
+hlist :: HList Fields
+hlist =
+    -- 59 .. 50
+    case letAs (HCons (MkT @"i59") HNil) of { LetAs (xs59 :: HList t59) ->
+    case letAs (HCons (MkT @"i58") xs59) of { LetAs (xs58 :: HList t58) ->
+    case letAs (HCons (MkT @"i57") xs58) of { LetAs (xs57 :: HList t57) ->
+    case letAs (HCons (MkT @"i56") xs57) of { LetAs (xs56 :: HList t56) ->
+    case letAs (HCons (MkT @"i55") xs56) of { LetAs (xs55 :: HList t55) ->
+    case letAs (HCons (MkT @"i54") xs55) of { LetAs (xs54 :: HList t54) ->
+    case letAs (HCons (MkT @"i53") xs54) of { LetAs (xs53 :: HList t53) ->
+    case letAs (HCons (MkT @"i52") xs53) of { LetAs (xs52 :: HList t52) ->
+    case letAs (HCons (MkT @"i51") xs52) of { LetAs (xs51 :: HList t51) ->
+    case letAs (HCons (MkT @"i50") xs51) of { LetAs (xs50 :: HList t50) ->
+    -- 49 .. 40
+    case letAs (HCons (MkT @"i49") xs50) of { LetAs (xs49 :: HList t49) ->
+    case letAs (HCons (MkT @"i48") xs49) of { LetAs (xs48 :: HList t48) ->
+    case letAs (HCons (MkT @"i47") xs48) of { LetAs (xs47 :: HList t47) ->
+    case letAs (HCons (MkT @"i46") xs47) of { LetAs (xs46 :: HList t46) ->
+    case letAs (HCons (MkT @"i45") xs46) of { LetAs (xs45 :: HList t45) ->
+    case letAs (HCons (MkT @"i44") xs45) of { LetAs (xs44 :: HList t44) ->
+    case letAs (HCons (MkT @"i43") xs44) of { LetAs (xs43 :: HList t43) ->
+    case letAs (HCons (MkT @"i42") xs43) of { LetAs (xs42 :: HList t42) ->
+    case letAs (HCons (MkT @"i41") xs42) of { LetAs (xs41 :: HList t41) ->
+    case letAs (HCons (MkT @"i40") xs41) of { LetAs (xs40 :: HList t40) ->
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") xs40) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs070.hs b/test/Test/Size/HList/LetAs/LetAs070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs070.hs
@@ -0,0 +1,96 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs070 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix070
+
+hlist :: HList Fields
+hlist =
+    -- 69 .. 60
+    case letAs (HCons (MkT @"i69") HNil) of { LetAs (xs69 :: HList t69) ->
+    case letAs (HCons (MkT @"i68") xs69) of { LetAs (xs68 :: HList t68) ->
+    case letAs (HCons (MkT @"i67") xs68) of { LetAs (xs67 :: HList t67) ->
+    case letAs (HCons (MkT @"i66") xs67) of { LetAs (xs66 :: HList t66) ->
+    case letAs (HCons (MkT @"i65") xs66) of { LetAs (xs65 :: HList t65) ->
+    case letAs (HCons (MkT @"i64") xs65) of { LetAs (xs64 :: HList t64) ->
+    case letAs (HCons (MkT @"i63") xs64) of { LetAs (xs63 :: HList t63) ->
+    case letAs (HCons (MkT @"i62") xs63) of { LetAs (xs62 :: HList t62) ->
+    case letAs (HCons (MkT @"i61") xs62) of { LetAs (xs61 :: HList t61) ->
+    case letAs (HCons (MkT @"i60") xs61) of { LetAs (xs60 :: HList t60) ->
+    -- 59 .. 50
+    case letAs (HCons (MkT @"i59") xs60) of { LetAs (xs59 :: HList t59) ->
+    case letAs (HCons (MkT @"i58") xs59) of { LetAs (xs58 :: HList t58) ->
+    case letAs (HCons (MkT @"i57") xs58) of { LetAs (xs57 :: HList t57) ->
+    case letAs (HCons (MkT @"i56") xs57) of { LetAs (xs56 :: HList t56) ->
+    case letAs (HCons (MkT @"i55") xs56) of { LetAs (xs55 :: HList t55) ->
+    case letAs (HCons (MkT @"i54") xs55) of { LetAs (xs54 :: HList t54) ->
+    case letAs (HCons (MkT @"i53") xs54) of { LetAs (xs53 :: HList t53) ->
+    case letAs (HCons (MkT @"i52") xs53) of { LetAs (xs52 :: HList t52) ->
+    case letAs (HCons (MkT @"i51") xs52) of { LetAs (xs51 :: HList t51) ->
+    case letAs (HCons (MkT @"i50") xs51) of { LetAs (xs50 :: HList t50) ->
+    -- 49 .. 40
+    case letAs (HCons (MkT @"i49") xs50) of { LetAs (xs49 :: HList t49) ->
+    case letAs (HCons (MkT @"i48") xs49) of { LetAs (xs48 :: HList t48) ->
+    case letAs (HCons (MkT @"i47") xs48) of { LetAs (xs47 :: HList t47) ->
+    case letAs (HCons (MkT @"i46") xs47) of { LetAs (xs46 :: HList t46) ->
+    case letAs (HCons (MkT @"i45") xs46) of { LetAs (xs45 :: HList t45) ->
+    case letAs (HCons (MkT @"i44") xs45) of { LetAs (xs44 :: HList t44) ->
+    case letAs (HCons (MkT @"i43") xs44) of { LetAs (xs43 :: HList t43) ->
+    case letAs (HCons (MkT @"i42") xs43) of { LetAs (xs42 :: HList t42) ->
+    case letAs (HCons (MkT @"i41") xs42) of { LetAs (xs41 :: HList t41) ->
+    case letAs (HCons (MkT @"i40") xs41) of { LetAs (xs40 :: HList t40) ->
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") xs40) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs080.hs b/test/Test/Size/HList/LetAs/LetAs080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs080.hs
@@ -0,0 +1,108 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs080 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix080
+
+hlist :: HList Fields
+hlist =
+    -- 79 .. 70
+    case letAs (HCons (MkT @"i79") HNil) of { LetAs (xs79 :: HList t79) ->
+    case letAs (HCons (MkT @"i78") xs79) of { LetAs (xs78 :: HList t78) ->
+    case letAs (HCons (MkT @"i77") xs78) of { LetAs (xs77 :: HList t77) ->
+    case letAs (HCons (MkT @"i76") xs77) of { LetAs (xs76 :: HList t76) ->
+    case letAs (HCons (MkT @"i75") xs76) of { LetAs (xs75 :: HList t75) ->
+    case letAs (HCons (MkT @"i74") xs75) of { LetAs (xs74 :: HList t74) ->
+    case letAs (HCons (MkT @"i73") xs74) of { LetAs (xs73 :: HList t73) ->
+    case letAs (HCons (MkT @"i72") xs73) of { LetAs (xs72 :: HList t72) ->
+    case letAs (HCons (MkT @"i71") xs72) of { LetAs (xs71 :: HList t71) ->
+    case letAs (HCons (MkT @"i70") xs71) of { LetAs (xs70 :: HList t70) ->
+    -- 69 .. 60
+    case letAs (HCons (MkT @"i69") xs70) of { LetAs (xs69 :: HList t69) ->
+    case letAs (HCons (MkT @"i68") xs69) of { LetAs (xs68 :: HList t68) ->
+    case letAs (HCons (MkT @"i67") xs68) of { LetAs (xs67 :: HList t67) ->
+    case letAs (HCons (MkT @"i66") xs67) of { LetAs (xs66 :: HList t66) ->
+    case letAs (HCons (MkT @"i65") xs66) of { LetAs (xs65 :: HList t65) ->
+    case letAs (HCons (MkT @"i64") xs65) of { LetAs (xs64 :: HList t64) ->
+    case letAs (HCons (MkT @"i63") xs64) of { LetAs (xs63 :: HList t63) ->
+    case letAs (HCons (MkT @"i62") xs63) of { LetAs (xs62 :: HList t62) ->
+    case letAs (HCons (MkT @"i61") xs62) of { LetAs (xs61 :: HList t61) ->
+    case letAs (HCons (MkT @"i60") xs61) of { LetAs (xs60 :: HList t60) ->
+    -- 59 .. 50
+    case letAs (HCons (MkT @"i59") xs60) of { LetAs (xs59 :: HList t59) ->
+    case letAs (HCons (MkT @"i58") xs59) of { LetAs (xs58 :: HList t58) ->
+    case letAs (HCons (MkT @"i57") xs58) of { LetAs (xs57 :: HList t57) ->
+    case letAs (HCons (MkT @"i56") xs57) of { LetAs (xs56 :: HList t56) ->
+    case letAs (HCons (MkT @"i55") xs56) of { LetAs (xs55 :: HList t55) ->
+    case letAs (HCons (MkT @"i54") xs55) of { LetAs (xs54 :: HList t54) ->
+    case letAs (HCons (MkT @"i53") xs54) of { LetAs (xs53 :: HList t53) ->
+    case letAs (HCons (MkT @"i52") xs53) of { LetAs (xs52 :: HList t52) ->
+    case letAs (HCons (MkT @"i51") xs52) of { LetAs (xs51 :: HList t51) ->
+    case letAs (HCons (MkT @"i50") xs51) of { LetAs (xs50 :: HList t50) ->
+    -- 49 .. 40
+    case letAs (HCons (MkT @"i49") xs50) of { LetAs (xs49 :: HList t49) ->
+    case letAs (HCons (MkT @"i48") xs49) of { LetAs (xs48 :: HList t48) ->
+    case letAs (HCons (MkT @"i47") xs48) of { LetAs (xs47 :: HList t47) ->
+    case letAs (HCons (MkT @"i46") xs47) of { LetAs (xs46 :: HList t46) ->
+    case letAs (HCons (MkT @"i45") xs46) of { LetAs (xs45 :: HList t45) ->
+    case letAs (HCons (MkT @"i44") xs45) of { LetAs (xs44 :: HList t44) ->
+    case letAs (HCons (MkT @"i43") xs44) of { LetAs (xs43 :: HList t43) ->
+    case letAs (HCons (MkT @"i42") xs43) of { LetAs (xs42 :: HList t42) ->
+    case letAs (HCons (MkT @"i41") xs42) of { LetAs (xs41 :: HList t41) ->
+    case letAs (HCons (MkT @"i40") xs41) of { LetAs (xs40 :: HList t40) ->
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") xs40) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs090.hs b/test/Test/Size/HList/LetAs/LetAs090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs090.hs
@@ -0,0 +1,120 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs090 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix090
+
+hlist :: HList Fields
+hlist =
+    -- 89 .. 80
+    case letAs (HCons (MkT @"i89") HNil) of { LetAs (xs89 :: HList t89) ->
+    case letAs (HCons (MkT @"i88") xs89) of { LetAs (xs88 :: HList t88) ->
+    case letAs (HCons (MkT @"i87") xs88) of { LetAs (xs87 :: HList t87) ->
+    case letAs (HCons (MkT @"i86") xs87) of { LetAs (xs86 :: HList t86) ->
+    case letAs (HCons (MkT @"i85") xs86) of { LetAs (xs85 :: HList t85) ->
+    case letAs (HCons (MkT @"i84") xs85) of { LetAs (xs84 :: HList t84) ->
+    case letAs (HCons (MkT @"i83") xs84) of { LetAs (xs83 :: HList t83) ->
+    case letAs (HCons (MkT @"i82") xs83) of { LetAs (xs82 :: HList t82) ->
+    case letAs (HCons (MkT @"i81") xs82) of { LetAs (xs81 :: HList t81) ->
+    case letAs (HCons (MkT @"i80") xs81) of { LetAs (xs80 :: HList t80) ->
+    -- 79 .. 70
+    case letAs (HCons (MkT @"i79") xs80) of { LetAs (xs79 :: HList t79) ->
+    case letAs (HCons (MkT @"i78") xs79) of { LetAs (xs78 :: HList t78) ->
+    case letAs (HCons (MkT @"i77") xs78) of { LetAs (xs77 :: HList t77) ->
+    case letAs (HCons (MkT @"i76") xs77) of { LetAs (xs76 :: HList t76) ->
+    case letAs (HCons (MkT @"i75") xs76) of { LetAs (xs75 :: HList t75) ->
+    case letAs (HCons (MkT @"i74") xs75) of { LetAs (xs74 :: HList t74) ->
+    case letAs (HCons (MkT @"i73") xs74) of { LetAs (xs73 :: HList t73) ->
+    case letAs (HCons (MkT @"i72") xs73) of { LetAs (xs72 :: HList t72) ->
+    case letAs (HCons (MkT @"i71") xs72) of { LetAs (xs71 :: HList t71) ->
+    case letAs (HCons (MkT @"i70") xs71) of { LetAs (xs70 :: HList t70) ->
+    -- 69 .. 60
+    case letAs (HCons (MkT @"i69") xs70) of { LetAs (xs69 :: HList t69) ->
+    case letAs (HCons (MkT @"i68") xs69) of { LetAs (xs68 :: HList t68) ->
+    case letAs (HCons (MkT @"i67") xs68) of { LetAs (xs67 :: HList t67) ->
+    case letAs (HCons (MkT @"i66") xs67) of { LetAs (xs66 :: HList t66) ->
+    case letAs (HCons (MkT @"i65") xs66) of { LetAs (xs65 :: HList t65) ->
+    case letAs (HCons (MkT @"i64") xs65) of { LetAs (xs64 :: HList t64) ->
+    case letAs (HCons (MkT @"i63") xs64) of { LetAs (xs63 :: HList t63) ->
+    case letAs (HCons (MkT @"i62") xs63) of { LetAs (xs62 :: HList t62) ->
+    case letAs (HCons (MkT @"i61") xs62) of { LetAs (xs61 :: HList t61) ->
+    case letAs (HCons (MkT @"i60") xs61) of { LetAs (xs60 :: HList t60) ->
+    -- 59 .. 50
+    case letAs (HCons (MkT @"i59") xs60) of { LetAs (xs59 :: HList t59) ->
+    case letAs (HCons (MkT @"i58") xs59) of { LetAs (xs58 :: HList t58) ->
+    case letAs (HCons (MkT @"i57") xs58) of { LetAs (xs57 :: HList t57) ->
+    case letAs (HCons (MkT @"i56") xs57) of { LetAs (xs56 :: HList t56) ->
+    case letAs (HCons (MkT @"i55") xs56) of { LetAs (xs55 :: HList t55) ->
+    case letAs (HCons (MkT @"i54") xs55) of { LetAs (xs54 :: HList t54) ->
+    case letAs (HCons (MkT @"i53") xs54) of { LetAs (xs53 :: HList t53) ->
+    case letAs (HCons (MkT @"i52") xs53) of { LetAs (xs52 :: HList t52) ->
+    case letAs (HCons (MkT @"i51") xs52) of { LetAs (xs51 :: HList t51) ->
+    case letAs (HCons (MkT @"i50") xs51) of { LetAs (xs50 :: HList t50) ->
+    -- 49 .. 40
+    case letAs (HCons (MkT @"i49") xs50) of { LetAs (xs49 :: HList t49) ->
+    case letAs (HCons (MkT @"i48") xs49) of { LetAs (xs48 :: HList t48) ->
+    case letAs (HCons (MkT @"i47") xs48) of { LetAs (xs47 :: HList t47) ->
+    case letAs (HCons (MkT @"i46") xs47) of { LetAs (xs46 :: HList t46) ->
+    case letAs (HCons (MkT @"i45") xs46) of { LetAs (xs45 :: HList t45) ->
+    case letAs (HCons (MkT @"i44") xs45) of { LetAs (xs44 :: HList t44) ->
+    case letAs (HCons (MkT @"i43") xs44) of { LetAs (xs43 :: HList t43) ->
+    case letAs (HCons (MkT @"i42") xs43) of { LetAs (xs42 :: HList t42) ->
+    case letAs (HCons (MkT @"i41") xs42) of { LetAs (xs41 :: HList t41) ->
+    case letAs (HCons (MkT @"i40") xs41) of { LetAs (xs40 :: HList t40) ->
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") xs40) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAs/LetAs100.hs b/test/Test/Size/HList/LetAs/LetAs100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAs/LetAs100.hs
@@ -0,0 +1,132 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAs.LetAs100 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix100
+
+hlist :: HList Fields
+hlist =
+    -- 99 .. 90
+    case letAs (HCons (MkT @"i99") HNil) of { LetAs (xs99 :: HList t99) ->
+    case letAs (HCons (MkT @"i98") xs99) of { LetAs (xs98 :: HList t98) ->
+    case letAs (HCons (MkT @"i97") xs98) of { LetAs (xs97 :: HList t97) ->
+    case letAs (HCons (MkT @"i96") xs97) of { LetAs (xs96 :: HList t96) ->
+    case letAs (HCons (MkT @"i95") xs96) of { LetAs (xs95 :: HList t95) ->
+    case letAs (HCons (MkT @"i94") xs95) of { LetAs (xs94 :: HList t94) ->
+    case letAs (HCons (MkT @"i93") xs94) of { LetAs (xs93 :: HList t93) ->
+    case letAs (HCons (MkT @"i92") xs93) of { LetAs (xs92 :: HList t92) ->
+    case letAs (HCons (MkT @"i91") xs92) of { LetAs (xs91 :: HList t91) ->
+    case letAs (HCons (MkT @"i90") xs91) of { LetAs (xs90 :: HList t90) ->
+    -- 89 .. 80
+    case letAs (HCons (MkT @"i89") xs90) of { LetAs (xs89 :: HList t89) ->
+    case letAs (HCons (MkT @"i88") xs89) of { LetAs (xs88 :: HList t88) ->
+    case letAs (HCons (MkT @"i87") xs88) of { LetAs (xs87 :: HList t87) ->
+    case letAs (HCons (MkT @"i86") xs87) of { LetAs (xs86 :: HList t86) ->
+    case letAs (HCons (MkT @"i85") xs86) of { LetAs (xs85 :: HList t85) ->
+    case letAs (HCons (MkT @"i84") xs85) of { LetAs (xs84 :: HList t84) ->
+    case letAs (HCons (MkT @"i83") xs84) of { LetAs (xs83 :: HList t83) ->
+    case letAs (HCons (MkT @"i82") xs83) of { LetAs (xs82 :: HList t82) ->
+    case letAs (HCons (MkT @"i81") xs82) of { LetAs (xs81 :: HList t81) ->
+    case letAs (HCons (MkT @"i80") xs81) of { LetAs (xs80 :: HList t80) ->
+    -- 79 .. 70
+    case letAs (HCons (MkT @"i79") xs80) of { LetAs (xs79 :: HList t79) ->
+    case letAs (HCons (MkT @"i78") xs79) of { LetAs (xs78 :: HList t78) ->
+    case letAs (HCons (MkT @"i77") xs78) of { LetAs (xs77 :: HList t77) ->
+    case letAs (HCons (MkT @"i76") xs77) of { LetAs (xs76 :: HList t76) ->
+    case letAs (HCons (MkT @"i75") xs76) of { LetAs (xs75 :: HList t75) ->
+    case letAs (HCons (MkT @"i74") xs75) of { LetAs (xs74 :: HList t74) ->
+    case letAs (HCons (MkT @"i73") xs74) of { LetAs (xs73 :: HList t73) ->
+    case letAs (HCons (MkT @"i72") xs73) of { LetAs (xs72 :: HList t72) ->
+    case letAs (HCons (MkT @"i71") xs72) of { LetAs (xs71 :: HList t71) ->
+    case letAs (HCons (MkT @"i70") xs71) of { LetAs (xs70 :: HList t70) ->
+    -- 69 .. 60
+    case letAs (HCons (MkT @"i69") xs70) of { LetAs (xs69 :: HList t69) ->
+    case letAs (HCons (MkT @"i68") xs69) of { LetAs (xs68 :: HList t68) ->
+    case letAs (HCons (MkT @"i67") xs68) of { LetAs (xs67 :: HList t67) ->
+    case letAs (HCons (MkT @"i66") xs67) of { LetAs (xs66 :: HList t66) ->
+    case letAs (HCons (MkT @"i65") xs66) of { LetAs (xs65 :: HList t65) ->
+    case letAs (HCons (MkT @"i64") xs65) of { LetAs (xs64 :: HList t64) ->
+    case letAs (HCons (MkT @"i63") xs64) of { LetAs (xs63 :: HList t63) ->
+    case letAs (HCons (MkT @"i62") xs63) of { LetAs (xs62 :: HList t62) ->
+    case letAs (HCons (MkT @"i61") xs62) of { LetAs (xs61 :: HList t61) ->
+    case letAs (HCons (MkT @"i60") xs61) of { LetAs (xs60 :: HList t60) ->
+    -- 59 .. 50
+    case letAs (HCons (MkT @"i59") xs60) of { LetAs (xs59 :: HList t59) ->
+    case letAs (HCons (MkT @"i58") xs59) of { LetAs (xs58 :: HList t58) ->
+    case letAs (HCons (MkT @"i57") xs58) of { LetAs (xs57 :: HList t57) ->
+    case letAs (HCons (MkT @"i56") xs57) of { LetAs (xs56 :: HList t56) ->
+    case letAs (HCons (MkT @"i55") xs56) of { LetAs (xs55 :: HList t55) ->
+    case letAs (HCons (MkT @"i54") xs55) of { LetAs (xs54 :: HList t54) ->
+    case letAs (HCons (MkT @"i53") xs54) of { LetAs (xs53 :: HList t53) ->
+    case letAs (HCons (MkT @"i52") xs53) of { LetAs (xs52 :: HList t52) ->
+    case letAs (HCons (MkT @"i51") xs52) of { LetAs (xs51 :: HList t51) ->
+    case letAs (HCons (MkT @"i50") xs51) of { LetAs (xs50 :: HList t50) ->
+    -- 49 .. 40
+    case letAs (HCons (MkT @"i49") xs50) of { LetAs (xs49 :: HList t49) ->
+    case letAs (HCons (MkT @"i48") xs49) of { LetAs (xs48 :: HList t48) ->
+    case letAs (HCons (MkT @"i47") xs48) of { LetAs (xs47 :: HList t47) ->
+    case letAs (HCons (MkT @"i46") xs47) of { LetAs (xs46 :: HList t46) ->
+    case letAs (HCons (MkT @"i45") xs46) of { LetAs (xs45 :: HList t45) ->
+    case letAs (HCons (MkT @"i44") xs45) of { LetAs (xs44 :: HList t44) ->
+    case letAs (HCons (MkT @"i43") xs44) of { LetAs (xs43 :: HList t43) ->
+    case letAs (HCons (MkT @"i42") xs43) of { LetAs (xs42 :: HList t42) ->
+    case letAs (HCons (MkT @"i41") xs42) of { LetAs (xs41 :: HList t41) ->
+    case letAs (HCons (MkT @"i40") xs41) of { LetAs (xs40 :: HList t40) ->
+    -- 39 .. 30
+    case letAs (HCons (MkT @"i39") xs40) of { LetAs (xs39 :: HList t39) ->
+    case letAs (HCons (MkT @"i38") xs39) of { LetAs (xs38 :: HList t38) ->
+    case letAs (HCons (MkT @"i37") xs38) of { LetAs (xs37 :: HList t37) ->
+    case letAs (HCons (MkT @"i36") xs37) of { LetAs (xs36 :: HList t36) ->
+    case letAs (HCons (MkT @"i35") xs36) of { LetAs (xs35 :: HList t35) ->
+    case letAs (HCons (MkT @"i34") xs35) of { LetAs (xs34 :: HList t34) ->
+    case letAs (HCons (MkT @"i33") xs34) of { LetAs (xs33 :: HList t33) ->
+    case letAs (HCons (MkT @"i32") xs33) of { LetAs (xs32 :: HList t32) ->
+    case letAs (HCons (MkT @"i31") xs32) of { LetAs (xs31 :: HList t31) ->
+    case letAs (HCons (MkT @"i30") xs31) of { LetAs (xs30 :: HList t30) ->
+    -- 29 .. 20
+    case letAs (HCons (MkT @"i29") xs30) of { LetAs (xs29 :: HList t29) ->
+    case letAs (HCons (MkT @"i28") xs29) of { LetAs (xs28 :: HList t28) ->
+    case letAs (HCons (MkT @"i27") xs28) of { LetAs (xs27 :: HList t27) ->
+    case letAs (HCons (MkT @"i26") xs27) of { LetAs (xs26 :: HList t26) ->
+    case letAs (HCons (MkT @"i25") xs26) of { LetAs (xs25 :: HList t25) ->
+    case letAs (HCons (MkT @"i24") xs25) of { LetAs (xs24 :: HList t24) ->
+    case letAs (HCons (MkT @"i23") xs24) of { LetAs (xs23 :: HList t23) ->
+    case letAs (HCons (MkT @"i22") xs23) of { LetAs (xs22 :: HList t22) ->
+    case letAs (HCons (MkT @"i21") xs22) of { LetAs (xs21 :: HList t21) ->
+    case letAs (HCons (MkT @"i20") xs21) of { LetAs (xs20 :: HList t20) ->
+    -- 19 .. 10
+    case letAs (HCons (MkT @"i19") xs20) of { LetAs (xs19 :: HList t19) ->
+    case letAs (HCons (MkT @"i18") xs19) of { LetAs (xs18 :: HList t18) ->
+    case letAs (HCons (MkT @"i17") xs18) of { LetAs (xs17 :: HList t17) ->
+    case letAs (HCons (MkT @"i16") xs17) of { LetAs (xs16 :: HList t16) ->
+    case letAs (HCons (MkT @"i15") xs16) of { LetAs (xs15 :: HList t15) ->
+    case letAs (HCons (MkT @"i14") xs15) of { LetAs (xs14 :: HList t14) ->
+    case letAs (HCons (MkT @"i13") xs14) of { LetAs (xs13 :: HList t13) ->
+    case letAs (HCons (MkT @"i12") xs13) of { LetAs (xs12 :: HList t12) ->
+    case letAs (HCons (MkT @"i11") xs12) of { LetAs (xs11 :: HList t11) ->
+    case letAs (HCons (MkT @"i10") xs11) of { LetAs (xs10 :: HList t10) ->
+    -- 09 .. 00
+    case letAs (HCons (MkT @"i09") xs10) of { LetAs (xs09 :: HList t09) ->
+    case letAs (HCons (MkT @"i08") xs09) of { LetAs (xs08 :: HList t08) ->
+    case letAs (HCons (MkT @"i07") xs08) of { LetAs (xs07 :: HList t07) ->
+    case letAs (HCons (MkT @"i06") xs07) of { LetAs (xs06 :: HList t06) ->
+    case letAs (HCons (MkT @"i05") xs06) of { LetAs (xs05 :: HList t05) ->
+    case letAs (HCons (MkT @"i04") xs05) of { LetAs (xs04 :: HList t04) ->
+    case letAs (HCons (MkT @"i03") xs04) of { LetAs (xs03 :: HList t03) ->
+    case letAs (HCons (MkT @"i02") xs03) of { LetAs (xs02 :: HList t02) ->
+    case letAs (HCons (MkT @"i01") xs02) of { LetAs (xs01 :: HList t01) ->
+    case letAs (HCons (MkT @"i00") xs01) of { LetAs (xs00 :: HList t00) ->
+      castEqual xs00
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
+    }}}}}}}}}}
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS010.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS010.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS010.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS010 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix010
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") HNil) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS020.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS020.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS020.hs
@@ -0,0 +1,34 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS020 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix020
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") HNil) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS030.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS030.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS030.hs
@@ -0,0 +1,45 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS030 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix030
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") HNil) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS040.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS040.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS040.hs
@@ -0,0 +1,56 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS040 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix040
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") HNil) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS050.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS050.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS050.hs
@@ -0,0 +1,67 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS050 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix050
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 49 .. 40
+    letAs' @(HList r) (HCons (MkT @"i49") HNil) $ \(xs49 :: HList t49) ->
+    letAs' @(HList r) (HCons (MkT @"i48") xs49) $ \(xs48 :: HList t48) ->
+    letAs' @(HList r) (HCons (MkT @"i47") xs48) $ \(xs47 :: HList t47) ->
+    letAs' @(HList r) (HCons (MkT @"i46") xs47) $ \(xs46 :: HList t46) ->
+    letAs' @(HList r) (HCons (MkT @"i45") xs46) $ \(xs45 :: HList t45) ->
+    letAs' @(HList r) (HCons (MkT @"i44") xs45) $ \(xs44 :: HList t44) ->
+    letAs' @(HList r) (HCons (MkT @"i43") xs44) $ \(xs43 :: HList t43) ->
+    letAs' @(HList r) (HCons (MkT @"i42") xs43) $ \(xs42 :: HList t42) ->
+    letAs' @(HList r) (HCons (MkT @"i41") xs42) $ \(xs41 :: HList t41) ->
+    letAs' @(HList r) (HCons (MkT @"i40") xs41) $ \(xs40 :: HList t40) ->
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") xs40) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS060.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS060.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS060.hs
@@ -0,0 +1,78 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS060 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix060
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 59 .. 50
+    letAs' @(HList r) (HCons (MkT @"i59") HNil) $ \(xs59 :: HList t59) ->
+    letAs' @(HList r) (HCons (MkT @"i58") xs59) $ \(xs58 :: HList t58) ->
+    letAs' @(HList r) (HCons (MkT @"i57") xs58) $ \(xs57 :: HList t57) ->
+    letAs' @(HList r) (HCons (MkT @"i56") xs57) $ \(xs56 :: HList t56) ->
+    letAs' @(HList r) (HCons (MkT @"i55") xs56) $ \(xs55 :: HList t55) ->
+    letAs' @(HList r) (HCons (MkT @"i54") xs55) $ \(xs54 :: HList t54) ->
+    letAs' @(HList r) (HCons (MkT @"i53") xs54) $ \(xs53 :: HList t53) ->
+    letAs' @(HList r) (HCons (MkT @"i52") xs53) $ \(xs52 :: HList t52) ->
+    letAs' @(HList r) (HCons (MkT @"i51") xs52) $ \(xs51 :: HList t51) ->
+    letAs' @(HList r) (HCons (MkT @"i50") xs51) $ \(xs50 :: HList t50) ->
+    -- 49 .. 40
+    letAs' @(HList r) (HCons (MkT @"i49") xs50) $ \(xs49 :: HList t49) ->
+    letAs' @(HList r) (HCons (MkT @"i48") xs49) $ \(xs48 :: HList t48) ->
+    letAs' @(HList r) (HCons (MkT @"i47") xs48) $ \(xs47 :: HList t47) ->
+    letAs' @(HList r) (HCons (MkT @"i46") xs47) $ \(xs46 :: HList t46) ->
+    letAs' @(HList r) (HCons (MkT @"i45") xs46) $ \(xs45 :: HList t45) ->
+    letAs' @(HList r) (HCons (MkT @"i44") xs45) $ \(xs44 :: HList t44) ->
+    letAs' @(HList r) (HCons (MkT @"i43") xs44) $ \(xs43 :: HList t43) ->
+    letAs' @(HList r) (HCons (MkT @"i42") xs43) $ \(xs42 :: HList t42) ->
+    letAs' @(HList r) (HCons (MkT @"i41") xs42) $ \(xs41 :: HList t41) ->
+    letAs' @(HList r) (HCons (MkT @"i40") xs41) $ \(xs40 :: HList t40) ->
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") xs40) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS070.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS070.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS070.hs
@@ -0,0 +1,89 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS070 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix070
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 69 .. 60
+    letAs' @(HList r) (HCons (MkT @"i69") HNil) $ \(xs69 :: HList t69) ->
+    letAs' @(HList r) (HCons (MkT @"i68") xs69) $ \(xs68 :: HList t68) ->
+    letAs' @(HList r) (HCons (MkT @"i67") xs68) $ \(xs67 :: HList t67) ->
+    letAs' @(HList r) (HCons (MkT @"i66") xs67) $ \(xs66 :: HList t66) ->
+    letAs' @(HList r) (HCons (MkT @"i65") xs66) $ \(xs65 :: HList t65) ->
+    letAs' @(HList r) (HCons (MkT @"i64") xs65) $ \(xs64 :: HList t64) ->
+    letAs' @(HList r) (HCons (MkT @"i63") xs64) $ \(xs63 :: HList t63) ->
+    letAs' @(HList r) (HCons (MkT @"i62") xs63) $ \(xs62 :: HList t62) ->
+    letAs' @(HList r) (HCons (MkT @"i61") xs62) $ \(xs61 :: HList t61) ->
+    letAs' @(HList r) (HCons (MkT @"i60") xs61) $ \(xs60 :: HList t60) ->
+    -- 59 .. 50
+    letAs' @(HList r) (HCons (MkT @"i59") xs60) $ \(xs59 :: HList t59) ->
+    letAs' @(HList r) (HCons (MkT @"i58") xs59) $ \(xs58 :: HList t58) ->
+    letAs' @(HList r) (HCons (MkT @"i57") xs58) $ \(xs57 :: HList t57) ->
+    letAs' @(HList r) (HCons (MkT @"i56") xs57) $ \(xs56 :: HList t56) ->
+    letAs' @(HList r) (HCons (MkT @"i55") xs56) $ \(xs55 :: HList t55) ->
+    letAs' @(HList r) (HCons (MkT @"i54") xs55) $ \(xs54 :: HList t54) ->
+    letAs' @(HList r) (HCons (MkT @"i53") xs54) $ \(xs53 :: HList t53) ->
+    letAs' @(HList r) (HCons (MkT @"i52") xs53) $ \(xs52 :: HList t52) ->
+    letAs' @(HList r) (HCons (MkT @"i51") xs52) $ \(xs51 :: HList t51) ->
+    letAs' @(HList r) (HCons (MkT @"i50") xs51) $ \(xs50 :: HList t50) ->
+    -- 49 .. 40
+    letAs' @(HList r) (HCons (MkT @"i49") xs50) $ \(xs49 :: HList t49) ->
+    letAs' @(HList r) (HCons (MkT @"i48") xs49) $ \(xs48 :: HList t48) ->
+    letAs' @(HList r) (HCons (MkT @"i47") xs48) $ \(xs47 :: HList t47) ->
+    letAs' @(HList r) (HCons (MkT @"i46") xs47) $ \(xs46 :: HList t46) ->
+    letAs' @(HList r) (HCons (MkT @"i45") xs46) $ \(xs45 :: HList t45) ->
+    letAs' @(HList r) (HCons (MkT @"i44") xs45) $ \(xs44 :: HList t44) ->
+    letAs' @(HList r) (HCons (MkT @"i43") xs44) $ \(xs43 :: HList t43) ->
+    letAs' @(HList r) (HCons (MkT @"i42") xs43) $ \(xs42 :: HList t42) ->
+    letAs' @(HList r) (HCons (MkT @"i41") xs42) $ \(xs41 :: HList t41) ->
+    letAs' @(HList r) (HCons (MkT @"i40") xs41) $ \(xs40 :: HList t40) ->
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") xs40) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS080.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS080.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS080.hs
@@ -0,0 +1,100 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS080 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix080
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 79 .. 70
+    letAs' @(HList r) (HCons (MkT @"i79") HNil) $ \(xs79 :: HList t79) ->
+    letAs' @(HList r) (HCons (MkT @"i78") xs79) $ \(xs78 :: HList t78) ->
+    letAs' @(HList r) (HCons (MkT @"i77") xs78) $ \(xs77 :: HList t77) ->
+    letAs' @(HList r) (HCons (MkT @"i76") xs77) $ \(xs76 :: HList t76) ->
+    letAs' @(HList r) (HCons (MkT @"i75") xs76) $ \(xs75 :: HList t75) ->
+    letAs' @(HList r) (HCons (MkT @"i74") xs75) $ \(xs74 :: HList t74) ->
+    letAs' @(HList r) (HCons (MkT @"i73") xs74) $ \(xs73 :: HList t73) ->
+    letAs' @(HList r) (HCons (MkT @"i72") xs73) $ \(xs72 :: HList t72) ->
+    letAs' @(HList r) (HCons (MkT @"i71") xs72) $ \(xs71 :: HList t71) ->
+    letAs' @(HList r) (HCons (MkT @"i70") xs71) $ \(xs70 :: HList t70) ->
+    -- 69 .. 60
+    letAs' @(HList r) (HCons (MkT @"i69") xs70) $ \(xs69 :: HList t69) ->
+    letAs' @(HList r) (HCons (MkT @"i68") xs69) $ \(xs68 :: HList t68) ->
+    letAs' @(HList r) (HCons (MkT @"i67") xs68) $ \(xs67 :: HList t67) ->
+    letAs' @(HList r) (HCons (MkT @"i66") xs67) $ \(xs66 :: HList t66) ->
+    letAs' @(HList r) (HCons (MkT @"i65") xs66) $ \(xs65 :: HList t65) ->
+    letAs' @(HList r) (HCons (MkT @"i64") xs65) $ \(xs64 :: HList t64) ->
+    letAs' @(HList r) (HCons (MkT @"i63") xs64) $ \(xs63 :: HList t63) ->
+    letAs' @(HList r) (HCons (MkT @"i62") xs63) $ \(xs62 :: HList t62) ->
+    letAs' @(HList r) (HCons (MkT @"i61") xs62) $ \(xs61 :: HList t61) ->
+    letAs' @(HList r) (HCons (MkT @"i60") xs61) $ \(xs60 :: HList t60) ->
+    -- 59 .. 50
+    letAs' @(HList r) (HCons (MkT @"i59") xs60) $ \(xs59 :: HList t59) ->
+    letAs' @(HList r) (HCons (MkT @"i58") xs59) $ \(xs58 :: HList t58) ->
+    letAs' @(HList r) (HCons (MkT @"i57") xs58) $ \(xs57 :: HList t57) ->
+    letAs' @(HList r) (HCons (MkT @"i56") xs57) $ \(xs56 :: HList t56) ->
+    letAs' @(HList r) (HCons (MkT @"i55") xs56) $ \(xs55 :: HList t55) ->
+    letAs' @(HList r) (HCons (MkT @"i54") xs55) $ \(xs54 :: HList t54) ->
+    letAs' @(HList r) (HCons (MkT @"i53") xs54) $ \(xs53 :: HList t53) ->
+    letAs' @(HList r) (HCons (MkT @"i52") xs53) $ \(xs52 :: HList t52) ->
+    letAs' @(HList r) (HCons (MkT @"i51") xs52) $ \(xs51 :: HList t51) ->
+    letAs' @(HList r) (HCons (MkT @"i50") xs51) $ \(xs50 :: HList t50) ->
+    -- 49 .. 40
+    letAs' @(HList r) (HCons (MkT @"i49") xs50) $ \(xs49 :: HList t49) ->
+    letAs' @(HList r) (HCons (MkT @"i48") xs49) $ \(xs48 :: HList t48) ->
+    letAs' @(HList r) (HCons (MkT @"i47") xs48) $ \(xs47 :: HList t47) ->
+    letAs' @(HList r) (HCons (MkT @"i46") xs47) $ \(xs46 :: HList t46) ->
+    letAs' @(HList r) (HCons (MkT @"i45") xs46) $ \(xs45 :: HList t45) ->
+    letAs' @(HList r) (HCons (MkT @"i44") xs45) $ \(xs44 :: HList t44) ->
+    letAs' @(HList r) (HCons (MkT @"i43") xs44) $ \(xs43 :: HList t43) ->
+    letAs' @(HList r) (HCons (MkT @"i42") xs43) $ \(xs42 :: HList t42) ->
+    letAs' @(HList r) (HCons (MkT @"i41") xs42) $ \(xs41 :: HList t41) ->
+    letAs' @(HList r) (HCons (MkT @"i40") xs41) $ \(xs40 :: HList t40) ->
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") xs40) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS090.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS090.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS090.hs
@@ -0,0 +1,111 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS090 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix090
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 89 .. 80
+    letAs' @(HList r) (HCons (MkT @"i89") HNil) $ \(xs89 :: HList t89) ->
+    letAs' @(HList r) (HCons (MkT @"i88") xs89) $ \(xs88 :: HList t88) ->
+    letAs' @(HList r) (HCons (MkT @"i87") xs88) $ \(xs87 :: HList t87) ->
+    letAs' @(HList r) (HCons (MkT @"i86") xs87) $ \(xs86 :: HList t86) ->
+    letAs' @(HList r) (HCons (MkT @"i85") xs86) $ \(xs85 :: HList t85) ->
+    letAs' @(HList r) (HCons (MkT @"i84") xs85) $ \(xs84 :: HList t84) ->
+    letAs' @(HList r) (HCons (MkT @"i83") xs84) $ \(xs83 :: HList t83) ->
+    letAs' @(HList r) (HCons (MkT @"i82") xs83) $ \(xs82 :: HList t82) ->
+    letAs' @(HList r) (HCons (MkT @"i81") xs82) $ \(xs81 :: HList t81) ->
+    letAs' @(HList r) (HCons (MkT @"i80") xs81) $ \(xs80 :: HList t80) ->
+    -- 79 .. 70
+    letAs' @(HList r) (HCons (MkT @"i79") xs80) $ \(xs79 :: HList t79) ->
+    letAs' @(HList r) (HCons (MkT @"i78") xs79) $ \(xs78 :: HList t78) ->
+    letAs' @(HList r) (HCons (MkT @"i77") xs78) $ \(xs77 :: HList t77) ->
+    letAs' @(HList r) (HCons (MkT @"i76") xs77) $ \(xs76 :: HList t76) ->
+    letAs' @(HList r) (HCons (MkT @"i75") xs76) $ \(xs75 :: HList t75) ->
+    letAs' @(HList r) (HCons (MkT @"i74") xs75) $ \(xs74 :: HList t74) ->
+    letAs' @(HList r) (HCons (MkT @"i73") xs74) $ \(xs73 :: HList t73) ->
+    letAs' @(HList r) (HCons (MkT @"i72") xs73) $ \(xs72 :: HList t72) ->
+    letAs' @(HList r) (HCons (MkT @"i71") xs72) $ \(xs71 :: HList t71) ->
+    letAs' @(HList r) (HCons (MkT @"i70") xs71) $ \(xs70 :: HList t70) ->
+    -- 69 .. 60
+    letAs' @(HList r) (HCons (MkT @"i69") xs70) $ \(xs69 :: HList t69) ->
+    letAs' @(HList r) (HCons (MkT @"i68") xs69) $ \(xs68 :: HList t68) ->
+    letAs' @(HList r) (HCons (MkT @"i67") xs68) $ \(xs67 :: HList t67) ->
+    letAs' @(HList r) (HCons (MkT @"i66") xs67) $ \(xs66 :: HList t66) ->
+    letAs' @(HList r) (HCons (MkT @"i65") xs66) $ \(xs65 :: HList t65) ->
+    letAs' @(HList r) (HCons (MkT @"i64") xs65) $ \(xs64 :: HList t64) ->
+    letAs' @(HList r) (HCons (MkT @"i63") xs64) $ \(xs63 :: HList t63) ->
+    letAs' @(HList r) (HCons (MkT @"i62") xs63) $ \(xs62 :: HList t62) ->
+    letAs' @(HList r) (HCons (MkT @"i61") xs62) $ \(xs61 :: HList t61) ->
+    letAs' @(HList r) (HCons (MkT @"i60") xs61) $ \(xs60 :: HList t60) ->
+    -- 59 .. 50
+    letAs' @(HList r) (HCons (MkT @"i59") xs60) $ \(xs59 :: HList t59) ->
+    letAs' @(HList r) (HCons (MkT @"i58") xs59) $ \(xs58 :: HList t58) ->
+    letAs' @(HList r) (HCons (MkT @"i57") xs58) $ \(xs57 :: HList t57) ->
+    letAs' @(HList r) (HCons (MkT @"i56") xs57) $ \(xs56 :: HList t56) ->
+    letAs' @(HList r) (HCons (MkT @"i55") xs56) $ \(xs55 :: HList t55) ->
+    letAs' @(HList r) (HCons (MkT @"i54") xs55) $ \(xs54 :: HList t54) ->
+    letAs' @(HList r) (HCons (MkT @"i53") xs54) $ \(xs53 :: HList t53) ->
+    letAs' @(HList r) (HCons (MkT @"i52") xs53) $ \(xs52 :: HList t52) ->
+    letAs' @(HList r) (HCons (MkT @"i51") xs52) $ \(xs51 :: HList t51) ->
+    letAs' @(HList r) (HCons (MkT @"i50") xs51) $ \(xs50 :: HList t50) ->
+    -- 49 .. 40
+    letAs' @(HList r) (HCons (MkT @"i49") xs50) $ \(xs49 :: HList t49) ->
+    letAs' @(HList r) (HCons (MkT @"i48") xs49) $ \(xs48 :: HList t48) ->
+    letAs' @(HList r) (HCons (MkT @"i47") xs48) $ \(xs47 :: HList t47) ->
+    letAs' @(HList r) (HCons (MkT @"i46") xs47) $ \(xs46 :: HList t46) ->
+    letAs' @(HList r) (HCons (MkT @"i45") xs46) $ \(xs45 :: HList t45) ->
+    letAs' @(HList r) (HCons (MkT @"i44") xs45) $ \(xs44 :: HList t44) ->
+    letAs' @(HList r) (HCons (MkT @"i43") xs44) $ \(xs43 :: HList t43) ->
+    letAs' @(HList r) (HCons (MkT @"i42") xs43) $ \(xs42 :: HList t42) ->
+    letAs' @(HList r) (HCons (MkT @"i41") xs42) $ \(xs41 :: HList t41) ->
+    letAs' @(HList r) (HCons (MkT @"i40") xs41) $ \(xs40 :: HList t40) ->
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") xs40) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/Size/HList/LetAsCPS/LetAsCPS100.hs b/test/Test/Size/HList/LetAsCPS/LetAsCPS100.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Size/HList/LetAsCPS/LetAsCPS100.hs
@@ -0,0 +1,122 @@
+{-# OPTIONS_GHC -fplugin=TypeLet #-}
+
+module Test.Size.HList.LetAsCPS.LetAsCPS100 where
+
+import TypeLet
+
+import Test.Infra
+import Test.Size.HList.Index.Ix100
+
+hlist :: HList Fields
+hlist = letT' (Proxy @Fields) $ \(_ :: Proxy r) -> castEqual $
+    -- 99 .. 90
+    letAs' @(HList r) (HCons (MkT @"i99") HNil) $ \(xs99 :: HList t99) ->
+    letAs' @(HList r) (HCons (MkT @"i98") xs99) $ \(xs98 :: HList t98) ->
+    letAs' @(HList r) (HCons (MkT @"i97") xs98) $ \(xs97 :: HList t97) ->
+    letAs' @(HList r) (HCons (MkT @"i96") xs97) $ \(xs96 :: HList t96) ->
+    letAs' @(HList r) (HCons (MkT @"i95") xs96) $ \(xs95 :: HList t95) ->
+    letAs' @(HList r) (HCons (MkT @"i94") xs95) $ \(xs94 :: HList t94) ->
+    letAs' @(HList r) (HCons (MkT @"i93") xs94) $ \(xs93 :: HList t93) ->
+    letAs' @(HList r) (HCons (MkT @"i92") xs93) $ \(xs92 :: HList t92) ->
+    letAs' @(HList r) (HCons (MkT @"i91") xs92) $ \(xs91 :: HList t91) ->
+    letAs' @(HList r) (HCons (MkT @"i90") xs91) $ \(xs90 :: HList t90) ->
+    -- 89 .. 80
+    letAs' @(HList r) (HCons (MkT @"i89") xs90) $ \(xs89 :: HList t89) ->
+    letAs' @(HList r) (HCons (MkT @"i88") xs89) $ \(xs88 :: HList t88) ->
+    letAs' @(HList r) (HCons (MkT @"i87") xs88) $ \(xs87 :: HList t87) ->
+    letAs' @(HList r) (HCons (MkT @"i86") xs87) $ \(xs86 :: HList t86) ->
+    letAs' @(HList r) (HCons (MkT @"i85") xs86) $ \(xs85 :: HList t85) ->
+    letAs' @(HList r) (HCons (MkT @"i84") xs85) $ \(xs84 :: HList t84) ->
+    letAs' @(HList r) (HCons (MkT @"i83") xs84) $ \(xs83 :: HList t83) ->
+    letAs' @(HList r) (HCons (MkT @"i82") xs83) $ \(xs82 :: HList t82) ->
+    letAs' @(HList r) (HCons (MkT @"i81") xs82) $ \(xs81 :: HList t81) ->
+    letAs' @(HList r) (HCons (MkT @"i80") xs81) $ \(xs80 :: HList t80) ->
+    -- 79 .. 70
+    letAs' @(HList r) (HCons (MkT @"i79") xs80) $ \(xs79 :: HList t79) ->
+    letAs' @(HList r) (HCons (MkT @"i78") xs79) $ \(xs78 :: HList t78) ->
+    letAs' @(HList r) (HCons (MkT @"i77") xs78) $ \(xs77 :: HList t77) ->
+    letAs' @(HList r) (HCons (MkT @"i76") xs77) $ \(xs76 :: HList t76) ->
+    letAs' @(HList r) (HCons (MkT @"i75") xs76) $ \(xs75 :: HList t75) ->
+    letAs' @(HList r) (HCons (MkT @"i74") xs75) $ \(xs74 :: HList t74) ->
+    letAs' @(HList r) (HCons (MkT @"i73") xs74) $ \(xs73 :: HList t73) ->
+    letAs' @(HList r) (HCons (MkT @"i72") xs73) $ \(xs72 :: HList t72) ->
+    letAs' @(HList r) (HCons (MkT @"i71") xs72) $ \(xs71 :: HList t71) ->
+    letAs' @(HList r) (HCons (MkT @"i70") xs71) $ \(xs70 :: HList t70) ->
+    -- 69 .. 60
+    letAs' @(HList r) (HCons (MkT @"i69") xs70) $ \(xs69 :: HList t69) ->
+    letAs' @(HList r) (HCons (MkT @"i68") xs69) $ \(xs68 :: HList t68) ->
+    letAs' @(HList r) (HCons (MkT @"i67") xs68) $ \(xs67 :: HList t67) ->
+    letAs' @(HList r) (HCons (MkT @"i66") xs67) $ \(xs66 :: HList t66) ->
+    letAs' @(HList r) (HCons (MkT @"i65") xs66) $ \(xs65 :: HList t65) ->
+    letAs' @(HList r) (HCons (MkT @"i64") xs65) $ \(xs64 :: HList t64) ->
+    letAs' @(HList r) (HCons (MkT @"i63") xs64) $ \(xs63 :: HList t63) ->
+    letAs' @(HList r) (HCons (MkT @"i62") xs63) $ \(xs62 :: HList t62) ->
+    letAs' @(HList r) (HCons (MkT @"i61") xs62) $ \(xs61 :: HList t61) ->
+    letAs' @(HList r) (HCons (MkT @"i60") xs61) $ \(xs60 :: HList t60) ->
+    -- 59 .. 50
+    letAs' @(HList r) (HCons (MkT @"i59") xs60) $ \(xs59 :: HList t59) ->
+    letAs' @(HList r) (HCons (MkT @"i58") xs59) $ \(xs58 :: HList t58) ->
+    letAs' @(HList r) (HCons (MkT @"i57") xs58) $ \(xs57 :: HList t57) ->
+    letAs' @(HList r) (HCons (MkT @"i56") xs57) $ \(xs56 :: HList t56) ->
+    letAs' @(HList r) (HCons (MkT @"i55") xs56) $ \(xs55 :: HList t55) ->
+    letAs' @(HList r) (HCons (MkT @"i54") xs55) $ \(xs54 :: HList t54) ->
+    letAs' @(HList r) (HCons (MkT @"i53") xs54) $ \(xs53 :: HList t53) ->
+    letAs' @(HList r) (HCons (MkT @"i52") xs53) $ \(xs52 :: HList t52) ->
+    letAs' @(HList r) (HCons (MkT @"i51") xs52) $ \(xs51 :: HList t51) ->
+    letAs' @(HList r) (HCons (MkT @"i50") xs51) $ \(xs50 :: HList t50) ->
+    -- 49 .. 40
+    letAs' @(HList r) (HCons (MkT @"i49") xs50) $ \(xs49 :: HList t49) ->
+    letAs' @(HList r) (HCons (MkT @"i48") xs49) $ \(xs48 :: HList t48) ->
+    letAs' @(HList r) (HCons (MkT @"i47") xs48) $ \(xs47 :: HList t47) ->
+    letAs' @(HList r) (HCons (MkT @"i46") xs47) $ \(xs46 :: HList t46) ->
+    letAs' @(HList r) (HCons (MkT @"i45") xs46) $ \(xs45 :: HList t45) ->
+    letAs' @(HList r) (HCons (MkT @"i44") xs45) $ \(xs44 :: HList t44) ->
+    letAs' @(HList r) (HCons (MkT @"i43") xs44) $ \(xs43 :: HList t43) ->
+    letAs' @(HList r) (HCons (MkT @"i42") xs43) $ \(xs42 :: HList t42) ->
+    letAs' @(HList r) (HCons (MkT @"i41") xs42) $ \(xs41 :: HList t41) ->
+    letAs' @(HList r) (HCons (MkT @"i40") xs41) $ \(xs40 :: HList t40) ->
+    -- 39 .. 30
+    letAs' @(HList r) (HCons (MkT @"i39") xs40) $ \(xs39 :: HList t39) ->
+    letAs' @(HList r) (HCons (MkT @"i38") xs39) $ \(xs38 :: HList t38) ->
+    letAs' @(HList r) (HCons (MkT @"i37") xs38) $ \(xs37 :: HList t37) ->
+    letAs' @(HList r) (HCons (MkT @"i36") xs37) $ \(xs36 :: HList t36) ->
+    letAs' @(HList r) (HCons (MkT @"i35") xs36) $ \(xs35 :: HList t35) ->
+    letAs' @(HList r) (HCons (MkT @"i34") xs35) $ \(xs34 :: HList t34) ->
+    letAs' @(HList r) (HCons (MkT @"i33") xs34) $ \(xs33 :: HList t33) ->
+    letAs' @(HList r) (HCons (MkT @"i32") xs33) $ \(xs32 :: HList t32) ->
+    letAs' @(HList r) (HCons (MkT @"i31") xs32) $ \(xs31 :: HList t31) ->
+    letAs' @(HList r) (HCons (MkT @"i30") xs31) $ \(xs30 :: HList t30) ->
+    -- 29 .. 20
+    letAs' @(HList r) (HCons (MkT @"i29") xs30) $ \(xs29 :: HList t29) ->
+    letAs' @(HList r) (HCons (MkT @"i28") xs29) $ \(xs28 :: HList t28) ->
+    letAs' @(HList r) (HCons (MkT @"i27") xs28) $ \(xs27 :: HList t27) ->
+    letAs' @(HList r) (HCons (MkT @"i26") xs27) $ \(xs26 :: HList t26) ->
+    letAs' @(HList r) (HCons (MkT @"i25") xs26) $ \(xs25 :: HList t25) ->
+    letAs' @(HList r) (HCons (MkT @"i24") xs25) $ \(xs24 :: HList t24) ->
+    letAs' @(HList r) (HCons (MkT @"i23") xs24) $ \(xs23 :: HList t23) ->
+    letAs' @(HList r) (HCons (MkT @"i22") xs23) $ \(xs22 :: HList t22) ->
+    letAs' @(HList r) (HCons (MkT @"i21") xs22) $ \(xs21 :: HList t21) ->
+    letAs' @(HList r) (HCons (MkT @"i20") xs21) $ \(xs20 :: HList t20) ->
+    -- 19 .. 10
+    letAs' @(HList r) (HCons (MkT @"i19") xs20) $ \(xs19 :: HList t19) ->
+    letAs' @(HList r) (HCons (MkT @"i18") xs19) $ \(xs18 :: HList t18) ->
+    letAs' @(HList r) (HCons (MkT @"i17") xs18) $ \(xs17 :: HList t17) ->
+    letAs' @(HList r) (HCons (MkT @"i16") xs17) $ \(xs16 :: HList t16) ->
+    letAs' @(HList r) (HCons (MkT @"i15") xs16) $ \(xs15 :: HList t15) ->
+    letAs' @(HList r) (HCons (MkT @"i14") xs15) $ \(xs14 :: HList t14) ->
+    letAs' @(HList r) (HCons (MkT @"i13") xs14) $ \(xs13 :: HList t13) ->
+    letAs' @(HList r) (HCons (MkT @"i12") xs13) $ \(xs12 :: HList t12) ->
+    letAs' @(HList r) (HCons (MkT @"i11") xs12) $ \(xs11 :: HList t11) ->
+    letAs' @(HList r) (HCons (MkT @"i10") xs11) $ \(xs10 :: HList t10) ->
+    -- 09 .. 00
+    letAs' @(HList r) (HCons (MkT @"i09") xs10) $ \(xs09 :: HList t09) ->
+    letAs' @(HList r) (HCons (MkT @"i08") xs09) $ \(xs08 :: HList t08) ->
+    letAs' @(HList r) (HCons (MkT @"i07") xs08) $ \(xs07 :: HList t07) ->
+    letAs' @(HList r) (HCons (MkT @"i06") xs07) $ \(xs06 :: HList t06) ->
+    letAs' @(HList r) (HCons (MkT @"i05") xs06) $ \(xs05 :: HList t05) ->
+    letAs' @(HList r) (HCons (MkT @"i04") xs05) $ \(xs04 :: HList t04) ->
+    letAs' @(HList r) (HCons (MkT @"i03") xs04) $ \(xs03 :: HList t03) ->
+    letAs' @(HList r) (HCons (MkT @"i02") xs03) $ \(xs02 :: HList t02) ->
+    letAs' @(HList r) (HCons (MkT @"i01") xs02) $ \(xs01 :: HList t01) ->
+    letAs' @(HList r) (HCons (MkT @"i00") xs01) $ \(xs00 :: HList t00) ->
+      castEqual xs00
diff --git a/test/Test/WithoutPlugin.hs b/test/Test/WithoutPlugin.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/WithoutPlugin.hs
@@ -0,0 +1,101 @@
+{-# OPTIONS_GHC -ddump-ds-preopt -ddump-ds -ddump-simpl -ddump-to-file #-}
+
+-- | Show that we do not /need/ the plugin; it's just more convenient.
+module Test.WithoutPlugin where
+
+import Data.Kind
+import Data.Type.Equality
+
+import Test.Infra
+
+data LetT :: a -> Type where
+  LetT :: (b :~: a) -> LetT a
+
+-- The NOINLINE pragma is essential, otherwise the inliner just undoes our work
+{-# NOINLINE letT #-}
+letT :: LetT a
+letT = LetT Refl
+
+castSingleLet :: Int -> Int
+castSingleLet x =
+    case letT of { LetT (p :: b :~: Int) ->
+      let x' :: b
+          x' = case p of Refl -> x
+      in case p of Refl -> x'
+    }
+
+-- | Correct version (albeit somewhat clunky)
+hlist1 :: HList '[A, B, C]
+hlist1 =
+   case letT of { LetT (p2 :: r2 :~: (C : '[])) ->
+   case letT of { LetT (p1 :: r1 :~: (B : r2 )) ->
+   case letT of { LetT (p0 :: r0 :~: (A : r1 )) ->
+
+     let xs2 :: HList r2
+         xs1 :: HList r1
+         xs0 :: HList r0
+
+         xs2 = case p2 of Refl -> HCons C HNil
+         xs1 = case p1 of Refl -> HCons B xs2
+         xs0 = case p0 of Refl -> HCons A xs1
+
+     in case p0 of { Refl ->
+        case p1 of { Refl ->
+        case p2 of { Refl ->
+          xs0
+        }}}
+
+   }}}
+
+-- | Unpacking the equalities in the wrong order (leading to quadratic code)
+hlist2 :: HList '[A, B, C]
+hlist2 =
+   case letT of { LetT (p2 :: r2 :~: (C : '[])) ->
+   case letT of { LetT (p1 :: r1 :~: (B : r2 )) ->
+   case letT of { LetT (p0 :: r0 :~: (A : r1 )) ->
+
+     let xs2 :: HList r2
+         xs1 :: HList r1
+         xs0 :: HList r0
+
+         xs2 = case p2 of Refl -> HCons C HNil
+         xs1 = case p1 of Refl -> HCons B xs2
+         xs0 = case p0 of Refl -> HCons A xs1
+
+     in case p2 of { Refl ->
+        case p1 of { Refl ->
+        case p0 of { Refl ->
+          xs0
+        }}}
+
+   }}}
+
+-- | Just for completeness, a version where /we/ construct equality proofs
+hlist3 :: HList '[A, B, C]
+hlist3 =
+   case letT of { LetT (p2 :: r2 :~: (C : '[])) ->
+   case letT of { LetT (p1 :: r1 :~: (B : r2 )) ->
+   case letT of { LetT (p0 :: r0 :~: (A : r1 )) ->
+
+     let xs2 :: HList r2
+         xs1 :: HList r1
+         xs0 :: HList r0
+
+         xs2 = castWith (cong (sym p2)) (HCons C HNil)
+         xs1 = castWith (cong (sym p1)) (HCons B xs2)
+         xs0 = castWith (cong (sym p0)) (HCons A xs1)
+
+     in castWith (cong (comp p0 (comp p1 p2))) xs0
+
+   }}}
+
+{-------------------------------------------------------------------------------
+  Auxiliary
+-------------------------------------------------------------------------------}
+
+cong :: (a :~: b) -> f a :~: f b
+cong Refl = Refl
+
+comp :: (a :~: x : b) -> b :~: c -> a :~: x : c
+comp Refl Refl = Refl
+
diff --git a/test/TestTypeLet.hs b/test/TestTypeLet.hs
new file mode 100644
--- /dev/null
+++ b/test/TestTypeLet.hs
@@ -0,0 +1,10 @@
+module Main (main) where
+
+import Test.Tasty
+
+import qualified Test.Sanity
+
+main :: IO ()
+main = defaultMain $ testGroup "TestTypeLet" [
+      Test.Sanity.tests
+    ]
diff --git a/typelet.cabal b/typelet.cabal
new file mode 100644
--- /dev/null
+++ b/typelet.cabal
@@ -0,0 +1,226 @@
+cabal-version:      2.4
+build-type:         Custom
+name:               typelet
+version:            0.1.0.0
+synopsis:           Plugin to faciliate type-level let
+description:        For a certain class of programs, type-level let is essential
+                    in order to be able to write these programs in such a way
+                    that they do not result in ghc core that is quadratic in
+                    size. Type-level let is not explicitly supported in ghc,
+                    but we can encode it. The @typelet@ library provides a
+                    type-checker plugin that makes the encoding more convenient
+                    to use as well as more effective.
+bug-reports:        https://github.com/well-typed/typelet/issues
+license:            BSD-3-Clause
+author:             Edsko de Vries
+maintainer:         edsko@well-typed.com
+copyright:          Well-Typed LLP, Juspay Technologies Pvt Ltd
+category:           Plugin
+extra-source-files: CHANGELOG.md
+
+source-repository head
+  type:     git
+  location: https://github.com/well-typed/typelet
+
+custom-setup
+    setup-depends:
+        base >= 4 && <5
+      , cabal-doctest >= 1 && <1.1
+
+library
+    exposed-modules:
+        TypeLet
+        TypeLet.UserAPI
+        TypeLet.Plugin
+    other-modules:
+        TypeLet.Plugin.Constraints
+        TypeLet.Plugin.GhcTcPluginAPI
+        TypeLet.Plugin.NameResolution
+        TypeLet.Plugin.Substitution
+    build-depends:
+        base >= 4.13 && < 4.17
+      , ghc-tcplugin-api >= 0.6 && < 0.7
+
+        -- whichever versions are bundled with ghc:
+      , containers
+      , ghc
+    hs-source-dirs:
+        src
+    default-language:
+        Haskell2010
+    default-extensions:
+        DataKinds
+        DeriveFunctor
+        FlexibleInstances
+        GADTs
+        KindSignatures
+        LambdaCase
+        MultiParamTypeClasses
+        PolyKinds
+        RankNTypes
+        RecordWildCards
+        ScopedTypeVariables
+        TupleSections
+    other-extensions:
+        CPP
+    ghc-options:
+        -Wall
+
+test-suite test-typelet
+    default-language:
+        Haskell2010
+    default-extensions:
+        DataKinds
+        FlexibleContexts
+        FlexibleInstances
+        GADTs
+        KindSignatures
+        MultiParamTypeClasses
+        PolyKinds
+        RankNTypes
+        ScopedTypeVariables
+        StandaloneDeriving
+        TypeApplications
+        TypeFamilies
+        TypeOperators
+        UndecidableInstances
+    type:
+        exitcode-stdio-1.0
+    hs-source-dirs:
+        test
+    main-is:
+        TestTypeLet.hs
+    other-modules:
+        Test.Infra
+        Test.Sanity
+        Test.WithoutPlugin
+
+    if flag(include-size-tests)
+      -- Currently the size tests are built, but not actually part of the test
+      -- suite proper. We are just interested in the size of their core.
+      other-modules:
+          Test.Size.Ap.Baseline.Baseline010
+          Test.Size.Ap.Baseline.Baseline020
+          Test.Size.Ap.Baseline.Baseline030
+          Test.Size.Ap.Baseline.Baseline040
+          Test.Size.Ap.Baseline.Baseline050
+          Test.Size.Ap.Baseline.Baseline060
+          Test.Size.Ap.Baseline.Baseline070
+          Test.Size.Ap.Baseline.Baseline080
+          Test.Size.Ap.Baseline.Baseline090
+          Test.Size.Ap.Baseline.Baseline100
+          Test.Size.Ap.Index.Ix010
+          Test.Size.Ap.Index.Ix020
+          Test.Size.Ap.Index.Ix030
+          Test.Size.Ap.Index.Ix040
+          Test.Size.Ap.Index.Ix050
+          Test.Size.Ap.Index.Ix060
+          Test.Size.Ap.Index.Ix070
+          Test.Size.Ap.Index.Ix080
+          Test.Size.Ap.Index.Ix090
+          Test.Size.Ap.Index.Ix100
+          Test.Size.Ap.Let.Let010
+          Test.Size.Ap.Let.Let020
+          Test.Size.Ap.Let.Let030
+          Test.Size.Ap.Let.Let040
+          Test.Size.Ap.Let.Let050
+          Test.Size.Ap.Let.Let060
+          Test.Size.Ap.Let.Let070
+          Test.Size.Ap.Let.Let080
+          Test.Size.Ap.Let.Let090
+          Test.Size.Ap.Let.Let100
+          Test.Size.HList.Baseline.Baseline010
+          Test.Size.HList.Baseline.Baseline020
+          Test.Size.HList.Baseline.Baseline030
+          Test.Size.HList.Baseline.Baseline040
+          Test.Size.HList.Baseline.Baseline050
+          Test.Size.HList.Baseline.Baseline060
+          Test.Size.HList.Baseline.Baseline070
+          Test.Size.HList.Baseline.Baseline080
+          Test.Size.HList.Baseline.Baseline090
+          Test.Size.HList.Baseline.Baseline100
+          Test.Size.HList.Index.Ix010
+          Test.Size.HList.Index.Ix020
+          Test.Size.HList.Index.Ix030
+          Test.Size.HList.Index.Ix040
+          Test.Size.HList.Index.Ix050
+          Test.Size.HList.Index.Ix060
+          Test.Size.HList.Index.Ix070
+          Test.Size.HList.Index.Ix080
+          Test.Size.HList.Index.Ix090
+          Test.Size.HList.Index.Ix100
+          Test.Size.HList.LetAs.LetAs010
+          Test.Size.HList.LetAs.LetAs020
+          Test.Size.HList.LetAs.LetAs030
+          Test.Size.HList.LetAs.LetAs040
+          Test.Size.HList.LetAs.LetAs050
+          Test.Size.HList.LetAs.LetAs060
+          Test.Size.HList.LetAs.LetAs070
+          Test.Size.HList.LetAs.LetAs080
+          Test.Size.HList.LetAs.LetAs090
+          Test.Size.HList.LetAs.LetAs100
+          Test.Size.HList.LetAsCPS.LetAsCPS010
+          Test.Size.HList.LetAsCPS.LetAsCPS020
+          Test.Size.HList.LetAsCPS.LetAsCPS030
+          Test.Size.HList.LetAsCPS.LetAsCPS040
+          Test.Size.HList.LetAsCPS.LetAsCPS050
+          Test.Size.HList.LetAsCPS.LetAsCPS060
+          Test.Size.HList.LetAsCPS.LetAsCPS070
+          Test.Size.HList.LetAsCPS.LetAsCPS080
+          Test.Size.HList.LetAsCPS.LetAsCPS090
+          Test.Size.HList.LetAsCPS.LetAsCPS100
+
+    build-depends:
+        base
+      , typelet
+      , tasty
+      , tasty-hunit
+      , tasty-quickcheck
+    ghc-options:
+        -Wall
+
+-- To use the doctest tests, enable flag build-doctest-examples
+test-suite doctest-typelet
+    type:
+        exitcode-stdio-1.0
+    default-language:
+        Haskell2010
+    hs-source-dirs:
+        doctest
+    main-is:
+        DoctestTypeLet.hs
+    build-depends:
+        base
+      , doctest
+      , typelet
+    x-doctest-components:
+        exe:doctest-examples-typelet
+
+    if !flag(build-doctest-examples)
+      buildable: False
+
+executable doctest-examples-typelet
+    main-is:
+        DoctestExamplesTypeLet.hs
+    default-language:
+        Haskell2010
+    default-extensions:
+        FlexibleContexts
+    hs-source-dirs:
+        doctest-examples
+    build-depends:
+        base
+      , typelet
+    ghc-options:
+        -Wwarn
+
+    if !flag(build-doctest-examples)
+      buildable: False
+
+Flag build-doctest-examples
+  Description: Build doctest-examples-typelet (for testing only)
+  Default: False
+
+Flag include-size-tests
+  Description: Include size tests in the test suite
+  Default: True
