diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+v0.1.5.0
+=======
+
+Fixes:
+
+* Bumped the `text` version to allow GHC 9.4 compatibility.
+
 v0.1.4.0
 =======
 
diff --git a/Data/SCargot/Print.hs b/Data/SCargot/Print.hs
--- a/Data/SCargot/Print.hs
+++ b/Data/SCargot/Print.hs
@@ -145,11 +145,12 @@
   -- final improper element (if it exists)
   | IEmpty
   -- ^ An empty list
+    deriving Show
 
 sizeOf :: Intermediate -> Size
 sizeOf IEmpty = Size 2 2
 sizeOf (IAtom t) = Size len len where len = T.length t
-sizeOf (IList _ s _ _ _) = s
+sizeOf (IList _ (Size n m) _ _ _) = Size (n + 2) (m + 2)
 
 concatSize :: Size -> Size -> Size
 concatSize l r = Size
@@ -194,7 +195,7 @@
       -- s-expressions, then we might as well consider it flat and let
       -- it take the whole line
       | Just strings <- T.traverse ppBasic (initial Seq.<| values) =
-        Seq.singleton (B.fromString "(" <> buildUnwords strings <> pTail rest)
+        Seq.singleton (B.singleton '(' <> buildUnwords strings <> pTail rest)
 
       -- it's not "flat", so we might want to swing after the first thing
       | Swing <- iv =
@@ -206,7 +207,7 @@
       -- ...or after several things
       | SwingAfter n <- iv =
           let (hs, xs) = Seq.splitAt n (initial Seq.<| values)
-              hd = B.fromString "(" <> buildUnwords (F.foldMap go hs)
+              hd = B.singleton '(' <> buildUnwords (F.foldMap go hs)
               butLast = hd Seq.<| fmap doIndent (F.foldMap go xs)
           in handleTail rest butLast
 
@@ -229,7 +230,7 @@
           -- with spaces and everything else gets indended the
           -- forementioned length
           y Seq.:< ys ->
-            let hd = B.fromString "(" <> buildUnwords (F.foldMap go (Seq.fromList [initial, y]))
+            let hd = B.singleton '(' <> buildUnwords (F.foldMap go (Seq.fromList [initial, y]))
                 butLast = hd Seq.<| fmap (doIndentOf (fromIntegral len)) (F.foldMap go ys)
             in handleTail rest butLast
 
@@ -242,25 +243,25 @@
     insertParen :: Seq.Seq B.Builder -> Seq.Seq B.Builder
     insertParen s = case Seq.viewl s of
       Seq.EmptyL -> s
-      x Seq.:< xs -> (B.fromString "(" <> x) Seq.<| xs
+      x Seq.:< xs -> (B.singleton '(' <> x) Seq.<| xs
 
     handleTail :: Maybe Text -> Seq.Seq B.Builder -> Seq.Seq B.Builder
     handleTail Nothing = insertCloseParen
     handleTail (Just t) =
-      (Seq.|> (B.fromString " . " <> B.fromText t <> B.fromString ")"))
+      (Seq.|> (B.fromString " . " <> B.fromText t <> B.singleton ')'))
 
     insertCloseParen :: Seq.Seq B.Builder -> Seq.Seq B.Builder
     insertCloseParen s = case Seq.viewr s of
-      Seq.EmptyR -> Seq.singleton (B.fromString ")")
-      xs Seq.:> x -> xs Seq.|> (x <> B.fromString ")")
+      Seq.EmptyR -> Seq.singleton (B.singleton ')')
+      xs Seq.:> x -> xs Seq.|> (x <> B.singleton ')')
 
     buildUnwords sq =
       case Seq.viewl sq of
       Seq.EmptyL -> mempty
-      t Seq.:< ts -> t <> F.foldMap (\ x -> B.fromString " " <> x) ts
+      t Seq.:< ts -> t <> F.foldMap (\ x -> B.singleton ' ' <> x) ts
 
-    pTail Nothing = B.fromString ")"
-    pTail (Just t) = B.fromString " . " <> B.fromText t <> B.fromString ")"
+    pTail Nothing = B.singleton ')'
+    pTail (Just t) = B.fromString " . " <> B.fromText t <> B.singleton ')'
 
     ppBasic (IAtom t) = Just (B.fromText t)
     ppBasic (IEmpty) = Just (B.fromString "()")
@@ -324,9 +325,13 @@
 setIndentStrategy st pr = pr { swingIndent = st }
 
 
+spaceDot :: B.Builder
+spaceDot = B.singleton ' ' <> B.singleton '.' <> B.singleton ' '
+
 -- Indents a line by n spaces
 indent :: Int -> B.Builder -> B.Builder
-indent n ts = B.fromText (T.replicate n " ") <> ts
+indent n ts =
+  mconcat [ B.singleton ' ' | _ <- [1..n]] <> ts
 
 
 -- Sort of like 'unlines' but without the trailing newline
@@ -344,7 +349,7 @@
   Seq.EmptyL -> ""
   t Seq.:< ts
     | F.null ts -> t
-    | otherwise -> t <> " " <> joinLinesS ts
+    | otherwise -> t <> " " <> unwordsS ts
 
 
 -- Indents every line n spaces, and adds a newline to the beginning
@@ -352,7 +357,6 @@
 indentAllS :: Int -> Seq.Seq B.Builder -> B.Builder
 indentAllS n = ("\n" <>) . joinLinesS . fmap (indent n)
 
-
 -- Indents every line but the first by some amount
 -- used in aligned indents
 indentSubsequentS :: Int -> Seq.Seq B.Builder -> B.Builder
@@ -386,7 +390,7 @@
     pp ind (IList i sz h values end) =
       -- we always are going to have a head, a (possibly empty) body,
       -- and a (possibly empty) tail in our list formats
-      B.fromString "(" <> hd <> body <> tl <> B.fromString ")"
+      B.singleton '(' <> hd <> body <> tl <> B.singleton ')'
       where
         -- the tail is either nothing, or the final dotted pair
         tl = case end of
@@ -416,10 +420,10 @@
           | length values == 0 = mempty
           -- if we can't fit the whole next s-expression on the same
           -- line, then we use the indented form
-          | sizeSum sz + ind > maxAmt = B.fromString " " <> indented
+          | sizeSum sz + ind > maxAmt = B.singleton ' ' <> indented
           | otherwise =
             -- otherwise we print the whole thing on one line!
-            B.fromString " " <> unwordsS (fmap (pp (ind + 1)) values)
+            B.singleton ' ' <> unwordsS (fmap (pp (ind + 1)) values)
 
 
 -- if we don't indent anything, then we can ignore a bunch of the
@@ -428,36 +432,42 @@
 flatPrintSExpr = B.toLazyText . pHead
   where
     pHead (SCons x xs) =
-      B.fromString "(" <> pHead x <> pTail xs
+      B.singleton '(' <> pHead x <> pTail xs
     pHead (SAtom t)    =
       B.fromText t
     pHead SNil         =
-      B.fromString "()"
+      B.singleton '(' <> B.singleton ')'
 
     pTail (SCons x xs) =
-      B.fromString " " <> pHead x <> pTail xs
+      B.singleton ' ' <> pHead x <> pTail xs
     pTail (SAtom t) =
-      B.fromString " . " <> B.fromText t <> B.fromString ")"
+      spaceDot <>
+      B.fromText t <>
+      B.singleton ')'
     pTail SNil =
-      B.fromString ")"
+      B.singleton ')'
 
+
 -- | Turn a single s-expression into a string according to a given
 --   'SExprPrinter'.
 encodeOne :: SExprPrinter atom carrier -> carrier -> Text
 encodeOne s@(SExprPrinter { .. }) =
   TL.toStrict . prettyPrintSExpr (s { fromCarrier = id }) . fromCarrier
 
+
 -- | Turn a list of s-expressions into a single string according to
 --   a given 'SExprPrinter'.
 encode :: SExprPrinter atom carrier -> [carrier] -> Text
 encode spec =
   T.intercalate "\n\n" . map (encodeOne spec)
 
+
 -- | Turn a single s-expression into a lazy 'Text' according to a given
 --   'SExprPrinter'.
 encodeOneLazy :: SExprPrinter atom carrier -> carrier -> TL.Text
 encodeOneLazy s@(SExprPrinter { .. }) =
   prettyPrintSExpr (s { fromCarrier = id }) . fromCarrier
+
 
 -- | Turn a list of s-expressions into a lazy 'Text' according to
 --   a given 'SExprPrinter'.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Hackage](https://img.shields.io/hackage/v/s-cargot.svg)](https://hackage.haskell.org/package/s-cargot)
+[![Hackage](https://img.shields.io/hackage/v/s-cargot.svg)](https://hackage.haskell.org/package/s-cargot) ![stability: stable](https://img.shields.io/badge/stability-stable-green.svg)
 
 S-Cargot is a library for parsing and emitting S-expressions, designed to be flexible, customizable, and extensible. Different uses of S-expressions often understand subtly different variations on what an S-expression is. The goal of S-Cargot is to create several reusable components that can be repurposed to nearly any S-expression variant.
 
diff --git a/s-cargot.cabal b/s-cargot.cabal
--- a/s-cargot.cabal
+++ b/s-cargot.cabal
@@ -1,5 +1,5 @@
 name:                s-cargot
-version:             0.1.4.0
+version:             0.1.5.0
 synopsis:            A flexible, extensible s-expression library.
 homepage:            https://github.com/aisamanra/s-cargot
 description:         S-Cargot is a library for working with s-expressions in
@@ -22,6 +22,7 @@
 extra-source-files:  README.md,
                      CHANGELOG.md,
                      test/*.sexp
+tested-with:         GHC == 8.8.4, GHC == 8.10.7, GHC == 9.0.2, GHC == 9.2.4, GHC == 9.4.2
 
 source-repository head
   type: git
@@ -47,7 +48,7 @@
                        Data.SCargot.Language.HaskLike
   build-depends:       base        >=4.7 && <5,
                        parsec      >=3.1 && <4,
-                       text        >=1.2 && <2,
+                       text        >=1.2 && <3,
                        containers  >=0.5 && <1
   default-language:    Haskell2010
   default-extensions:  CPP
@@ -63,7 +64,7 @@
                        containers  >=0.5 && <1,
                        parsec      >=3.1 && <4,
                        s-cargot               ,
-                       text        >=1.2 && <2
+                       text        >=1.2 && <3
   default-language:    Haskell2010
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
 
@@ -77,7 +78,7 @@
                     base          >=4.7 && <5,
                     parsec        >=3.1 && <4,
                     QuickCheck    >=2.8 && <3,
-                    text          >=1.2 && <2
+                    text          >=1.2 && <3
 
 
 test-suite s-cargot-printparse
@@ -89,4 +90,4 @@
                     base          >=4.7 && <5,
                     parsec        >=3.1 && <4,
                     HUnit         >=1.6 && <1.7,
-                    text          >=1.2 && <2
+                    text          >=1.2 && <3
