diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,41 +1,68 @@
-# Changelog
+Changelog
+=========
 
-## 1.0.0.0 - 2018-12-20
+1.0.0.15 - 2023-02-01
+--------------------------------------------------
 
-- Initial release
+Support GHC 9.4
 
-## 1.0.0.1 - 2019-05-18
 
-- Replace `hex-text` package dependency with slightly smaller `base16-bytestring` dependency
+1.0.0.14 - 2022-01-09
+--------------------------------------------------
 
-## 1.0.0.2 - 2020-04-18
+Support GHC 9.2
 
-Tightened dependency version bounds
 
-## 1.0.0.4 - 2020-05-20
+1.0.0.12 - 2022-01-08
+--------------------------------------------------
 
-Support GHC 8.10
+Drop `cryptonite` and `memory` dependencies; HMAC is
+now done using the `cryptohash-sha256` package instead
 
-## 1.0.0.6 - 2020-09-02
+Add some tests for the `isSigValid` function
 
-Support cryptonite 0.27
 
-## 1.0.0.8 - 2021-03-08
+1.0.0.10 - 2021-06-05
+--------------------------------------------------
 
+Support GHC 9.0, `cryptonite` 0.29, `bytestring` 0.11,
+`memory` 0.16
+
+Switch `base16-bytestring` version from 0.1 to 1.0
+
+
+1.0.0.8 - 2021-03-08
+--------------------------------------------------
+
 Support cryptonite 0.28
 
-## 1.0.0.10 - 2021-06-05
 
-Support GHC 9.0, `cryptonite` 0.29, `bytestring` 0.11, `memory` 0.16
+1.0.0.6 - 2020-09-02
+--------------------------------------------------
 
-Switch `base16-bytestring` version from 0.1 to 1.0
+Support cryptonite 0.27
 
-## 1.0.0.12 - 2022-01-08
 
-Drop `cryptonite` and `memory` dependencies; HMAC is now done using the `cryptohash-sha256` package instead
+1.0.0.4 - 2020-05-20
+--------------------------------------------------
 
-Add some tests for the `isSigValid` function
+Support GHC 8.10
 
-## 1.0.0.14 - 2022-01-09
 
-Support GHC 9.2
+1.0.0.2 - 2020-04-18
+--------------------------------------------------
+
+Tightened dependency version bounds
+
+
+1.0.0.1 - 2019-05-18
+--------------------------------------------------
+
+Replace `hex-text` package dependency with slightly
+smaller `base16-bytestring` dependency
+
+
+1.0.0.0 - 2018-12-20
+--------------------------------------------------
+
+Initial release
diff --git a/readme.md b/readme.md
new file mode 100644
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,6 @@
+When [Stripe] sends an event to your webhook, it includes an HTTP header named
+`Stripe-Signature`. You should use this to verify the authenticity of the
+request to ensure that you are not acting upon forged events originating from
+some source other than Stripe.
+
+  [Stripe]: https://stripe.com/
diff --git a/stripe-signature.cabal b/stripe-signature.cabal
--- a/stripe-signature.cabal
+++ b/stripe-signature.cabal
@@ -1,15 +1,13 @@
-cabal-version: 2.0
+cabal-version: 3.0
 
 name: stripe-signature
-version: 1.0.0.14
-
+version: 1.0.0.15
 synopsis: Verification of Stripe webhook signatures
 category: Web
 
-description:
-    When <https://stripe.com/ Stripe> sends an event to your webhook, it
-    includes an HTTP header named @Stripe-Signature@. You should use this
-    to verify the authenticity of the request to ensure that you are not
+description: When Stripe sends an event to your webhook, it includes
+    an HTTP header named “Stripe-Signature”. You should use this to
+    verify the authenticity of the request to ensure that you are not
     acting upon forged events originating from some source other than
     Stripe.
 
@@ -23,40 +21,27 @@
 license: MIT
 license-file: license.txt
 
-build-type: Simple
-
-extra-source-files:
-    changelog.md
+extra-source-files: *.md
 
-library
-    hs-source-dirs: library
+common base
     default-language: Haskell2010
     ghc-options: -Wall
-
-    exposed-modules:
-        Stripe.Signature
-
     build-depends:
-        base ^>= 4.10 || ^>= 4.11 || ^>= 4.12 || ^>= 4.13 || ^>= 4.14
-          || ^>= 4.15 || ^>= 4.16
-      , base16-bytestring ^>= 1.0
-      , bytestring ^>= 0.10 || ^>= 0.11
-      , cryptohash-sha256 ^>= 0.11.101
-      , stripe-concepts ^>= 1.0
-      , text ^>= 1.2
+      , base ^>= 4.14 || ^>= 4.15 || ^>= 4.16 || ^>= 4.17
+      , base16-bytestring ^>= 1.0.2
+      , bytestring ^>= 0.10.12 || ^>= 0.11
+      , cryptohash-sha256 ^>= 0.11.102
+      , stripe-concepts ^>= 1.0.3
+      , text ^>= 1.2.4 || ^>= 2.0
 
-test-suite test
-    default-language: Haskell2010
+library
+    import: base
+    hs-source-dirs: library
+    exposed-modules: Stripe.Signature
+
+test-suite test-stripe-signature
+    import: base
     hs-source-dirs: test
     type: exitcode-stdio-1.0
     main-is: test.hs
-    ghc-options: -Wall
-
-    build-depends:
-        base ^>= 4.10 || ^>= 4.11 || ^>= 4.12 || ^>= 4.13 || ^>= 4.14
-          || ^>= 4.15 || ^>= 4.16
-      , base16-bytestring ^>= 1.0
-      , bytestring ^>= 0.10 || ^>= 0.11
-      , stripe-concepts ^>= 1.0
-      , stripe-signature
-      , text ^>= 1.2
+    build-depends: stripe-signature
