diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for yasi
 
+## 0.2.0.2 -- 2024-01-05
+
+ * Update to `text-display-1.0`
+ * Drop support for GHC `<9.2`
+
 ## 0.2.0.1 -- 2022-03-13
 
  * Update `text-display`, which makes an internal hack unnecessary
diff --git a/src/Yasi.hs b/src/Yasi.hs
--- a/src/Yasi.hs
+++ b/src/Yasi.hs
@@ -18,16 +18,17 @@
 where
 
 import Data.String (IsString (..))
-import qualified Data.Text as T
-import qualified Data.Text.Lazy as TL
-import qualified Language.Haskell.TH.Quote as TH
-import qualified Language.Haskell.TH.Syntax as TH
+import Data.Text qualified as T
+import Data.Text.Lazy qualified as TL
+import Language.Haskell.TH.Quote qualified as TH
+import Language.Haskell.TH.Syntax qualified as TH
 import Yasi.Internal
 
 -- $setup
 -- >>> import Yasi
 -- >>> import Data.Text (Text)
 -- >>> import qualified Data.Text.Lazy
+-- >>> import Data.String (IsString)
 
 int :: (TH.Exp -> TH.Exp) -> TH.QuasiQuoter
 int = interpolator '$'
@@ -59,7 +60,7 @@
 -- @['iFS'|...|] = 'fromString' ['i'|...|]@
 --
 -- >>> :t [iFS|hi|]
--- [iFS|hi|] :: Data.String.IsString a => a
+-- [iFS|hi|] :: IsString a => a
 iFS :: TH.QuasiQuoter
 iFS = int $ TH.AppE (TH.VarE 'fromString)
 
diff --git a/src/Yasi/Internal.hs b/src/Yasi/Internal.hs
--- a/src/Yasi/Internal.hs
+++ b/src/Yasi/Internal.hs
@@ -9,16 +9,17 @@
 where
 
 import Control.Monad ((>=>))
-import qualified Data.Char as C
-import qualified Data.Text as T
-import qualified Data.Text.Display as TD
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Builder as TLB
+import Data.Char qualified as C
+import Data.List (foldl')
+import Data.Text qualified as T
+import Data.Text.Builder.Linear qualified as TBL
+import Data.Text.Display qualified as TD
+import Data.Text.Lazy qualified as TL
 import GHC.Generics (Generic)
-import qualified Language.Haskell.Meta.Parse as GhcHsMeta
-import qualified Language.Haskell.TH.Lib as TH
-import qualified Language.Haskell.TH.Quote as TH
-import qualified Language.Haskell.TH.Syntax as TH
+import Language.Haskell.Meta.Parse qualified as GhcHsMeta
+import Language.Haskell.TH.Lib qualified as TH
+import Language.Haskell.TH.Quote qualified as TH
+import Language.Haskell.TH.Syntax qualified as TH
 
 data Segment
   = Lit String
@@ -26,7 +27,7 @@
   | Abs -- idea due to interpolate
   deriving (Show, Eq, Generic)
 
-parseSegments :: MonadFail m => Char -> String -> m [Segment]
+parseSegments :: (MonadFail m) => Char -> String -> m [Segment]
 parseSegments c = fmap (group []) . go
   where
     -- ugly, but simple enough™
@@ -61,7 +62,7 @@
     . lams
     . transform
     . TH.AppE (TH.VarE 'stringish)
-    . foldr (flip TH.UInfixE (TH.VarE '(<>))) (TH.VarE 'mempty)
+    . foldl' (\a b -> TH.InfixE (Just a) (TH.VarE '(<>)) (Just b)) (TH.VarE 'mempty)
     $ ls
   where
     go = \case
@@ -99,13 +100,13 @@
     quoteDec = const $ fail "declaration context not supported"
 
 class Stringish a where
-  stringish :: TLB.Builder -> a
+  stringish :: TBL.Builder -> a
 
 instance Stringish String where
-  stringish = TL.unpack . TLB.toLazyText
+  stringish = T.unpack . TBL.runBuilder
 
 instance Stringish T.Text where
-  stringish = TL.toStrict . TLB.toLazyText
+  stringish = TBL.runBuilder
 
 instance Stringish TL.Text where
-  stringish = TLB.toLazyText
+  stringish = TL.fromStrict . TBL.runBuilder
diff --git a/src/Yasi/Util.hs b/src/Yasi/Util.hs
--- a/src/Yasi/Util.hs
+++ b/src/Yasi/Util.hs
@@ -4,9 +4,9 @@
   )
 where
 
-import qualified Data.Char as C
+import Data.Char qualified as C
 import Data.List (dropWhileEnd)
-import qualified Data.Text as T
+import Data.Text qualified as T
 
 -- $setup
 -- >>> import Yasi
diff --git a/test/Interpolations.hs b/test/Interpolations.hs
--- a/test/Interpolations.hs
+++ b/test/Interpolations.hs
@@ -1,12 +1,12 @@
 module Interpolations where
 
 import Control.Applicative (Const (..))
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Text.Display (display)
-import qualified Data.Text.Lazy as TL
+import Data.Text.Lazy qualified as TL
 import Hedgehog
-import qualified Hedgehog.Gen as Gen
-import qualified Hedgehog.Range as Range
+import Hedgehog.Gen qualified as Gen
+import Hedgehog.Range qualified as Range
 import Test.Tasty
 import Test.Tasty.HUnit
 import Test.Tasty.Hedgehog
diff --git a/test/Util.hs b/test/Util.hs
--- a/test/Util.hs
+++ b/test/Util.hs
@@ -1,9 +1,9 @@
 module Util where
 
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Hedgehog
-import qualified Hedgehog.Gen as Gen
-import qualified Hedgehog.Range as Range
+import Hedgehog.Gen qualified as Gen
+import Hedgehog.Range qualified as Range
 import Test.Tasty
 import Test.Tasty.HUnit
 import Test.Tasty.Hedgehog
diff --git a/yasi.cabal b/yasi.cabal
--- a/yasi.cabal
+++ b/yasi.cabal
@@ -1,13 +1,12 @@
 cabal-version: 2.4
 name: yasi
-version: 0.2.0.1
-
+version: 0.2.0.2
 synopsis: Yet another string interpolator
 description:
   Yet another string interpolator,
   with a different set of tradeoffs
-category: String, Text, QuasiQuotes
 
+category: String, Text, QuasiQuotes
 homepage: https://github.com/amesgen/yasi
 bug-reports: https://github.com/amesgen/yasi/issues
 license: CC0-1.0
@@ -22,10 +21,23 @@
   type: git
 
 common commons
-  default-language: Haskell2010
-  ghc-options: -Wall -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -fno-warn-name-shadowing -Wunused-packages
-  default-extensions: BlockArguments DeriveGeneric FlexibleContexts FlexibleInstances LambdaCase MultiParamTypeClasses OverloadedStrings QuasiQuotes RecordWildCards ScopedTypeVariables TemplateHaskell TupleSections
+  default-language: GHC2021
+  ghc-options:
+    -Wall
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wredundant-constraints
+    -fno-warn-name-shadowing
+    -Wunused-packages
 
+  default-extensions:
+    BlockArguments
+    LambdaCase
+    OverloadedStrings
+    QuasiQuotes
+    RecordWildCards
+    TemplateHaskell
+
 library
   import: commons
   ghc-options: -Wmissing-export-lists
@@ -34,31 +46,39 @@
     Yasi
     Yasi.Internal
     Yasi.Util
+
   build-depends:
-      base >= 4.14 && < 5
-    , template-haskell >= 2.16 && < 2.19
-    , text >= 1.2 && < 2.1
-    , text-display ^>= 0.0.2
-    , ghc-hs-meta ^>= 0.1
+    base >=4.16 && <5,
+    ghc-hs-meta ^>=0.1,
+    template-haskell >=2.16 && <2.24,
+    text >=1.2 && <2.2,
+    text-builder-linear ^>=0.1,
+    text-display ^>=1,
 
 test-suite tasty
   import: commons
   type: exitcode-stdio-1.0
   main-is: Driver.hs
   hs-source-dirs: test
-  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  ghc-options:
+    -threaded
+    -rtsopts
+    -with-rtsopts=-N
+
   build-tool-depends:
-      tasty-discover:tasty-discover ^>= 4.2
+    tasty-discover:tasty-discover ^>=4.2
+
   build-depends:
-      base
-    , yasi
-    , text
-    , text-display
-    , tasty >= 1.3 && < 1.5
-    , tasty-hunit ^>= 0.10
-    , tasty-hedgehog >= 1.0 && < 1.3
-    , hedgehog >= 1.0 && < 1.2
+    base,
+    hedgehog >=1.0 && <1.6,
+    tasty >=1.3 && <1.6,
+    tasty-hedgehog >=1.0 && <1.5,
+    tasty-hunit ^>=0.10,
+    text,
+    text-display,
+    yasi,
+
   other-modules:
-      Segments
-      Interpolations
-      Util
+    Interpolations
+    Segments
+    Util
