diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for nonempty-vector
 
+## 0.2.3
+
+* Support GHC 9.8.x
+
 ## 0.2.2.0
 
 * Drop support for GHC<8.10, update CI, bump bounds for `primitive`.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,11 +1,7 @@
 # Non-empty Vectors
 
-![Build Status](https://github.com/emilypi/nonempty-vector/workflows/CI/badge.svg) [![Hackage](https://img.shields.io/hackage/v/nonempty-vector.svg)](https://hackage.haskell.org/package/nonempty-vector)
+![Build Status](https://github.com/emilypi/nonempty-vector/actions/workflows/haskell-ci.yml/badge.svg) [![Hackage](https://img.shields.io/hackage/v/nonempty-vector.svg)](https://hackage.haskell.org/package/nonempty-vector)
 
-This package presents thin wrappers around mutable and immutable [Data.Vector](https://hackage.haskell.org/package/vector) types. The entire Vector API is supported for both sets of boxed vectors, with future plans to support unboxed, primitive, storable, and generic vectors.
+This package presents thin wrappers around mutable and immutable [Data.Vector](https://hackage.haskell.org/package/vector) types that enforce non-emptiness. The entire Vector API is supported for both sets of boxed vectors, with future plans to support unboxed, primitive, storable, and generic vectors.
 
 There are no external dependencies that are not already in `base`.
-
-### Motivation
-
-Every "container" in the Haskell ecosystem features a [non-empty variant](https://hackage.haskell.org/package/nonempty-containers), including the venerable [list](https://hackage.haskell.org/package/semigroups), aside from `vector`. Many (including myself) use `vector` for its incredible performance characteristics achieved over many years by the CLC and authors of the library. But many of us also want to adhere to the principle of least power, and not have to worry about whether `head` or `tail` (for example) are safe. This package addresses both of the previous points. No new pointer indirection is exposed by this library except at construction (and even then - `unsafe` constructors are supplied), with as much reuse of `vector`'s library as possible to make sure asymptotics stay the same.
diff --git a/nonempty-vector.cabal b/nonempty-vector.cabal
--- a/nonempty-vector.cabal
+++ b/nonempty-vector.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.0
 name:            nonempty-vector
-version:         0.2.2.0
+version:         0.2.3
 synopsis:        Non-empty vectors
 description:     Performant, non-empty mutable and immutable vectors
 homepage:        https://github.com/emilypi/nonempty-vector
@@ -21,6 +21,8 @@
    || ==9.0.2
    || ==9.2.6
    || ==9.4.4
+   || ==9.6.3
+   || ==9.8.1
 
 source-repository head
   type:     git
@@ -33,7 +35,7 @@
     Data.Vector.NonEmpty.Mutable
 
   build-depends:
-      base       >=4.14  && <5
+      base       >=4.14  && <4.20
     , deepseq
     , primitive  >=0.6  && <0.9
     , vector     >=0.12 && <0.14
@@ -47,7 +49,7 @@
   type:              exitcode-stdio-1.0
   main-is:           Main.hs
   build-depends:
-      base     >=4.14 && <5
+      base     >=4.14 && <4.20
     , nonempty-vector
     , QuickCheck
     , tasty
diff --git a/src/Data/Vector/NonEmpty.hs b/src/Data/Vector/NonEmpty.hs
--- a/src/Data/Vector/NonEmpty.hs
+++ b/src/Data/Vector/NonEmpty.hs
@@ -1,9 +1,8 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE Rank2Types #-}
-{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE RankNTypes #-}
 -- |
 -- Module       : Data.Vector.NonEmpty
--- Copyright 	: (c) 2019-2020 Emily Pillmore
+-- Copyright 	: (c) 2019-2023 Emily Pillmore
 -- License	: BSD-style
 --
 -- Maintainer	: Emily Pillmore <emilypi@cohomolo.gy>
@@ -192,7 +191,7 @@
 
 import qualified Data.Foldable as Foldable
 import Data.Either (Either(..))
-import Data.Functor
+import Data.Functor hiding (unzip)
 import Data.Int
 import Data.List.NonEmpty (NonEmpty(..))
 import qualified Data.List.NonEmpty as NonEmpty
diff --git a/src/Data/Vector/NonEmpty/Internal.hs b/src/Data/Vector/NonEmpty/Internal.hs
--- a/src/Data/Vector/NonEmpty/Internal.hs
+++ b/src/Data/Vector/NonEmpty/Internal.hs
@@ -2,10 +2,9 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE LambdaCase #-}
-{-# LANGUAGE Trustworthy #-}
 -- |
 -- Module      : Data.Vector.NonEmpty.Internal
--- Copyright   : (c) 2019-2020 Emily Pillmore
+-- Copyright   : (c) 2019-2023 Emily Pillmore
 -- License     : BSD-style
 --
 -- Maintainer  : Emily Pillmore <emilypi@cohomolo.gy>
@@ -38,11 +37,12 @@
 
 import Data.Data (Data)
 import qualified Data.Foldable as Foldable
+#if MIN_VERSION_base(4,18,0)
+import Data.Foldable1 (Foldable1)
+import qualified Data.Foldable1 as Foldable1
+#endif
 import Data.Functor.Classes (Eq1, Ord1, Show1, Read1(..))
 import qualified Data.Vector as V
-#if __GLASGOW_HASKELL__ < 804
-import Data.Semigroup (Semigroup(..))
-#endif
 import Data.Typeable (Typeable)
 import Data.Vector.Mutable (MVector)
 
@@ -82,18 +82,31 @@
       as -> return (NonEmptyVector $ V.fromList as)
 
 instance Read1 NonEmptyVector where
-#if __GLASGOW_HASKELL__ > 802
     liftReadPrec _ rl = rl >>= \case
       [] -> Read.pfail
       as -> return (NonEmptyVector $ V.fromList as)
-#else
-    liftReadsPrec _ r _ s = r s >>= \case
-      ([], _) -> []
-      (as, s') -> return (NonEmptyVector $ V.fromList as, s')
-#endif
 
 instance Foldable NonEmptyVector where
     foldMap f = Foldable.foldMap f . _neVec
+
+#if MIN_VERSION_base(4,18,0)
+instance Foldable1 NonEmptyVector where
+    foldMap1 f (NonEmptyVector v) =
+        let
+          h = V.unsafeHead v -- gauranteed head (nonemptiness)
+          t = V.unsafeTail v -- gauranteed possibly empty tail
+        in go (f h) t -- therefore this is a sound call
+      where
+        go x xs
+          -- when xs is empty, vector is exhausted, return x
+          | V.null xs = x
+          | otherwise =
+          -- if xs is not empty, then there are at least 2 elements in the list. Hence, h and t are sound calls to make.
+            let
+              h = V.unsafeHead xs
+              t = V.unsafeTail xs
+            in x <> go (f h) t
+#endif
 
 instance Traversable NonEmptyVector where
     traverse f = fmap NonEmptyVector . traverse f . _neVec
diff --git a/src/Data/Vector/NonEmpty/Mutable.hs b/src/Data/Vector/NonEmpty/Mutable.hs
--- a/src/Data/Vector/NonEmpty/Mutable.hs
+++ b/src/Data/Vector/NonEmpty/Mutable.hs
@@ -1,10 +1,9 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE Trustworthy #-}
 -- |
 -- Module      : Data.Vector.NonEmpty.Mutable
--- Copyright   : (c) 2019-2020 Emily Pillmore
+-- Copyright   : (c) 2019-2023 Emily Pillmore
 -- License     : BSD-style
 --
 -- Maintainer  : Emily Pillmore <emilypi@cohomolo.gy>
