diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,15 @@
+## Version 0.11 (2023-10-31)
+
+- Migrate to the *crypton* library ecosystem.  *crypton* was a hard
+  fork of *cryptonite*, which was no longer maintained.  With this
+  change, the minimum supported version of GHC increased to 8.8.
+  There are no other notable changes in this release.
+
+- The `v0.10` series is the last release series to support
+  *cryptonite*.  It will continue to receive important bug fixes
+  until the end of 2024.
+
+
 ## Version 0.10 (2022-09-01)
 
 - Introduce `newtype JOSE e m a` which behaves like `ExceptT e m a`
diff --git a/example/KeyDB.hs b/example/KeyDB.hs
--- a/example/KeyDB.hs
+++ b/example/KeyDB.hs
@@ -9,7 +9,6 @@
 
 import Control.Exception (IOException, handle)
 import Data.Maybe (catMaybes)
-import Data.Semigroup ((<>))
 
 import Control.Monad.Trans (MonadIO(..))
 import Control.Lens (_Just, preview)
diff --git a/example/Main.hs b/example/Main.hs
--- a/example/Main.hs
+++ b/example/Main.hs
@@ -2,7 +2,6 @@
 {-# LANGUAGE FlexibleContexts #-}
 
 import Data.Maybe (fromJust)
-import Data.Semigroup ((<>))
 import System.Environment (getArgs)
 import System.Exit (die, exitFailure)
 
diff --git a/jose.cabal b/jose.cabal
--- a/jose.cabal
+++ b/jose.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                jose
-version:             0.10.0.1
+version:             0.11
 synopsis:
   JSON Object Signing and Encryption (JOSE) and JSON Web Token (JWT) library
 description:
@@ -33,7 +33,7 @@
 category:            Cryptography
 build-type:          Simple
 tested-with:
-  GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.7 || ==9.4.7 || ==9.6.3 || == 9.8.1
+  GHC ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.7 || ==9.4.7 || ==9.6.3 || == 9.8.1
 
 flag demos
   description: Build demonstration programs
@@ -76,7 +76,7 @@
       -Wredundant-strictness-flags
 
   build-depends:
-    base >= 4.9 && < 5
+    base >= 4.13 && < 5
     , bytestring >= 0.10 && < 0.13
     , lens >= 4.16
     , mtl >= 2.2.1
@@ -111,14 +111,14 @@
     , base64-bytestring >= 1.2.1.0 && < 1.3
     , concise >= 0.1
     , containers >= 0.5
-    , cryptonite >= 0.24
+    , crypton >= 0.31
     , memory >= 0.7
     , monad-time >= 0.3
     , template-haskell >= 2.11
     , text >= 1.1
     , time >= 1.5
     , network-uri >= 2.6
-    , x509 >= 1.4
+    , crypton-x509 >= 1.7.6
 
   hs-source-dirs: src
 
@@ -144,10 +144,10 @@
     , aeson
     , base64-bytestring
     , containers
-    , cryptonite
+    , crypton
     , time
     , network-uri
-    , x509
+    , crypton-x509
     , pem
 
     , concise
diff --git a/src/Crypto/JOSE/Error.hs b/src/Crypto/JOSE/Error.hs
--- a/src/Crypto/JOSE/Error.hs
+++ b/src/Crypto/JOSE/Error.hs
@@ -41,7 +41,6 @@
 
   ) where
 
-import Data.Semigroup ((<>))
 import Numeric.Natural
 
 import Control.Monad.Except (MonadError(..), ExceptT, runExceptT)
diff --git a/src/Crypto/JOSE/Header.hs b/src/Crypto/JOSE/Header.hs
--- a/src/Crypto/JOSE/Header.hs
+++ b/src/Crypto/JOSE/Header.hs
@@ -66,7 +66,6 @@
 import qualified Control.Monad.Fail as Fail
 import Data.Kind (Type)
 import Data.List.NonEmpty (NonEmpty)
-import Data.Monoid ((<>))
 import Data.Proxy (Proxy(..))
 
 import Control.Lens (Lens', Getter, review, to)
diff --git a/src/Crypto/JOSE/JWA/JWK.hs b/src/Crypto/JOSE/JWA/JWK.hs
--- a/src/Crypto/JOSE/JWA/JWK.hs
+++ b/src/Crypto/JOSE/JWA/JWK.hs
@@ -77,7 +77,6 @@
 import Data.Bifunctor
 import Data.Foldable (toList)
 import Data.Maybe (isJust)
-import Data.Monoid ((<>))
 
 import Control.Lens hiding ((.=), elements)
 import Control.Monad.Error.Lens (throwing, throwing_)
diff --git a/src/Crypto/JOSE/JWE.hs b/src/Crypto/JOSE/JWE.hs
--- a/src/Crypto/JOSE/JWE.hs
+++ b/src/Crypto/JOSE/JWE.hs
@@ -27,7 +27,6 @@
 import Control.Applicative ((<|>))
 import Data.Bifunctor (bimap)
 import Data.Maybe (catMaybes, fromMaybe)
-import Data.Monoid ((<>))
 
 import Control.Lens (view, views)
 import Data.Aeson
diff --git a/src/Crypto/JOSE/JWK.hs b/src/Crypto/JOSE/JWK.hs
--- a/src/Crypto/JOSE/JWK.hs
+++ b/src/Crypto/JOSE/JWK.hs
@@ -92,7 +92,6 @@
 import Control.Monad ((>=>))
 import Data.Function (on)
 import Data.Maybe (catMaybes)
-import Data.Monoid ((<>))
 import Data.Word (Word8)
 
 import Control.Lens hiding ((.=))
diff --git a/src/Crypto/JOSE/JWS.hs b/src/Crypto/JOSE/JWS.hs
--- a/src/Crypto/JOSE/JWS.hs
+++ b/src/Crypto/JOSE/JWS.hs
@@ -92,7 +92,6 @@
 import Control.Monad (unless)
 import Data.Foldable (toList)
 import Data.Maybe (catMaybes, fromMaybe)
-import Data.Monoid ((<>))
 import Data.List.NonEmpty (NonEmpty)
 import Data.Word (Word8)
 
diff --git a/src/Crypto/JWT.hs b/src/Crypto/JWT.hs
--- a/src/Crypto/JWT.hs
+++ b/src/Crypto/JWT.hs
@@ -95,7 +95,6 @@
 import Data.Functor.Identity
 import Data.Maybe
 import qualified Data.String
-import Data.Semigroup ((<>))
 
 import Control.Lens (
   makeClassy, makeClassyPrisms, makePrisms,
diff --git a/test/JWK.hs b/test/JWK.hs
--- a/test/JWK.hs
+++ b/test/JWK.hs
@@ -19,8 +19,6 @@
   ( spec
   ) where
 
-import Data.Monoid ((<>))
-
 import Control.Lens (_Left, _Right, review, view)
 import Control.Lens.Extras (is)
 import Data.Aeson
diff --git a/test/JWS.hs b/test/JWS.hs
--- a/test/JWS.hs
+++ b/test/JWS.hs
@@ -19,7 +19,6 @@
   ) where
 
 import Data.Maybe
-import Data.Monoid ((<>))
 
 import Control.Lens hiding ((.=))
 import Control.Lens.Extras (is)
diff --git a/test/JWT.hs b/test/JWT.hs
--- a/test/JWT.hs
+++ b/test/JWT.hs
@@ -20,7 +20,6 @@
   ) where
 
 import Data.Maybe
-import Data.Monoid ((<>))
 
 import qualified Data.ByteString.Lazy as L
 import Control.Lens
