diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for text-ascii
 
+## 1.0 -- 2021-10-31
+
+* Support GHC 9.2.
+* Remove support for GHCs below 8.10.
+* Add `eitherFromText` and `eitherFromByteString` for better conversion errors.
+
 ## 1.0.1 -- 2021-03-02
 
 * Support GHC 9.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# `text-ascii`
+# `text-ascii` [![Hackage](https://img.shields.io/hackage/v/text-ascii?style=flat-square)][hackage]
 
 ## What is this thing?
 
@@ -50,12 +50,11 @@
 
 ## What does this run on?
 
-Currently, our CI checks the following versions of GHC:
+We support the latest three releases of GHC. Currently, these are:
 
-* 8.6.5
-* 8.8.4
 * 8.10.4
 * 9.0.1
+* 9.2.1
 
 We check on the following platforms:
 
@@ -63,8 +62,13 @@
 * Linux
 * MacOS
 
+Currently, there is no support for GHC 9.2.1 with Windows in our CI. We will fix
+this as soon as possible.
+
 ## What can I do with this?
 
 The project is licensed Apache 2.0 (SPDX code
 [`Apache-2.0`](https://spdx.org/licenses/Apache-2.0.html)). For more details,
 please see the `LICENSE.md` file.
+
+[hackage]: https://hackage.haskell.org/package/text-ascii
diff --git a/src/Text/Ascii.hs b/src/Text/Ascii.hs
--- a/src/Text/Ascii.hs
+++ b/src/Text/Ascii.hs
@@ -133,7 +133,9 @@
 
     -- * Conversions
     fromText,
+    eitherFromText,
     fromByteString,
+    eitherFromByteString,
     toText,
     toByteString,
 
@@ -1930,6 +1932,22 @@
   Nothing -> pure . AsciiText . encodeUtf8 $ t
   Just _ -> Nothing
 
+-- | Try and convert a 'Text' into an 'AsciiText'. Gives @'Prelude.Left' c@ if the 'Text'
+-- contains a 'Prelude.Char' @c@ that lacks an ASCII representation.
+--
+-- >>> eitherFromText "catboy"
+-- Right "catboy"
+-- >>> eitherFromText "😺😺😺😺😺"
+-- Left '\128570'
+--
+-- /Complexity:/ \(\Theta(n)\)
+--
+-- @since 1.1
+eitherFromText :: Text -> P.Either P.Char AsciiText
+eitherFromText t = case T.find (not . isAscii) t of
+  Nothing -> pure . AsciiText . encodeUtf8 $ t
+  Just c -> P.Left c
+
 -- | Try and convert a 'ByteString' into an 'AsciiText'. Gives 'Nothing' if the
 -- 'ByteString' contains any bytes outside the ASCII range (that is, from 0 to
 -- 127 inclusive).
@@ -1946,6 +1964,23 @@
 fromByteString bs = case BS.find (> 127) bs of
   Nothing -> pure . AsciiText $ bs
   Just _ -> Nothing
+
+-- | Try and convert a 'ByteString' into an 'AsciiText'. Gives @'Prelude.Left' w8@ if
+-- the 'ByteString' contains a byte @w8@ that is outside the ASCII range (that
+-- is, from 0 to 127 inclusive).
+--
+-- >>> eitherFromByteString "catboy"
+-- Right "catboy"
+-- >>> eitherFromByteString . BS.pack $ [128]
+-- Left 128
+--
+-- /Complexity:/ \(\Theta(n)\)
+--
+-- @since 1.1
+eitherFromByteString :: ByteString -> P.Either Word8 AsciiText
+eitherFromByteString bs = case BS.find (> 127) bs of
+  Nothing -> pure . AsciiText $ bs
+  Just w8 -> P.Left w8
 
 -- | Convert an 'AsciiText' into a 'Text' (by copying).
 --
diff --git a/src/Text/Ascii/Unsafe.hs b/src/Text/Ascii/Unsafe.hs
--- a/src/Text/Ascii/Unsafe.hs
+++ b/src/Text/Ascii/Unsafe.hs
@@ -71,10 +71,10 @@
 -- | A wrapper for a type, designating that partial type class methods or other
 -- functions are available for it.
 --
--- The role of 'Unsafe''s type argument is set to nominal. Among other things,
--- it means that this type can't be coerced or derived through. This ensures
--- clear indication when (and to what extent) non-total operations occur in any
--- code using them.
+-- We set the role of the type argument of 'Unsafe' to nominal. Among other
+-- things, it means that this type can't be coerced or derived through. This
+-- ensures clear indication when (and to what extent) non-total operations occur
+-- in any code using them.
 --
 -- @since 1.0.1
 newtype Unsafe (a :: Type) = Unsafe {safe :: a}
diff --git a/text-ascii.cabal b/text-ascii.cabal
--- a/text-ascii.cabal
+++ b/text-ascii.cabal
@@ -1,20 +1,20 @@
 cabal-version:      3.0
 name:               text-ascii
-version:            1.0.1
+version:            1.1
 synopsis:           ASCII string and character processing.
 description:
   A total-by-default, tested and documented library for
   working with ASCII text. Low on dependencies , high on usability.
 
-homepage:           https://github.org/kozross/text-ascii
+homepage:           https://github.com/haskell-text/text-ascii
 license:            Apache-2.0
 license-file:       LICENSE.md
 author:             Koz Ross
 maintainer:         koz.ross@retro-freedom.nz
-bug-reports:        https://github.org/kozross/text-ascii/issues
+bug-reports:        https://github.com/haskell-text/text-ascii/issues
 copyright:          (C) Koz Ross 2021
 category:           Text
-tested-with:        GHC ==8.6.5 || ==8.8.4 || ==8.10.3 || ==9.0.1
+tested-with:        GHC ==8.10.5 || ==9.0.1 || ==9.2.1
 build-type:         Simple
 extra-source-files:
   CHANGELOG.md
@@ -29,7 +29,7 @@
     Text.Ascii.Unsafe
 
   build-depends:
-    , base              >=4.12     && <5
+    , base              >=4.14     && <5
     , bytestring        ^>=0.11.0.0
     , case-insensitive  ^>=1.2.1.0
     , deepseq           ^>=1.4.0.0
@@ -37,7 +37,7 @@
     , megaparsec        ^>=9.0.1
     , optics-core       ^>=0.4
     , optics-extra      ^>=0.4
-    , template-haskell  >=2.14.0.0 && <3.0.0.0
+    , template-haskell  >=2.16.0.0 && <3.0.0.0
     , text              ^>=1.2.4.1
 
   ghc-options:
