diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # arch-web
 
+## 0.3
+
+Migrate to SPDX License Identifiers
+
 ## 0.2
 
 * Allow lens 5.1/5.2, aeson 2.1, servant 0.19.1+
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/arch-web.cabal b/arch-web.cabal
--- a/arch-web.cabal
+++ b/arch-web.cabal
@@ -1,6 +1,6 @@
 cabal-version:   2.2
 name:            arch-web
-version:         0.2
+version:         0.3
 synopsis:        Arch Linux official and AUR web interface binding
 description:
   Arch Linux official and AUR web interface binding.
@@ -23,18 +23,18 @@
 
 common common
   build-depends:
-    , aeson                ^>=1.5.4 || ^>=2.0 || ^>=2.1
-    , base                 >=4.10   && <5
+    , aeson                ^>=1.5.4  || ^>=2.0   || ^>=2.1 || ^>=2.2
+    , base                 >=4.10    && <5
     , deriving-aeson       ^>=0.2.6
     , exceptions           ^>=0.10.4
-    , http-client          ^>=0.6.4 || ^>=0.7.4
+    , http-client          ^>=0.6.4  || ^>=0.7.4
     , http-client-tls      ^>=0.3.5
     , http-types           ^>=0.12.3
-    , lens                 ^>=4.19.2 || ^>=5 || ^>=5.1 || ^>=5.2
+    , lens                 ^>=4.19.2 || ^>=5     || ^>=5.1 || ^>=5.2
     , mtl
-    , servant              >=0.18   && <0.20
-    , servant-client       >=0.18   && <0.20
-    , servant-client-core  >=0.18   && <0.20
+    , servant              >=0.18    && <0.21
+    , servant-client       >=0.18    && <0.21
+    , servant-client-core  >=0.18    && <0.21
     , text
     , time
 
@@ -56,7 +56,6 @@
     ghc-options: -Wmissing-deriving-strategies
 
   default-extensions:
-    NoStarIsType
     ConstraintKinds
     DataKinds
     DeriveAnyClass
@@ -69,6 +68,7 @@
     FunctionalDependencies
     KindSignatures
     LambdaCase
+    NoStarIsType
     OverloadedStrings
     RecordWildCards
     ScopedTypeVariables
diff --git a/src/Web/ArchLinux/Types.hs b/src/Web/ArchLinux/Types.hs
--- a/src/Web/ArchLinux/Types.hs
+++ b/src/Web/ArchLinux/Types.hs
@@ -15,6 +15,8 @@
     Repo (..),
     Arch (..),
     License (..),
+    licenseId,
+    parseLicense,
     PackageInformation (..),
     PackageFiles (..),
     Flagged (..),
@@ -43,7 +45,7 @@
 unString (String x) = x
 unString _ = undefined
 
-toQueryParamViaJSON :: ToJSON a => a -> Text
+toQueryParamViaJSON :: (ToJSON a) => a -> Text
 toQueryParamViaJSON = unString . fromJust . decode . encode
 
 data AurModifier
@@ -94,57 +96,316 @@
 instance ToHttpApiData Arch where
   toQueryParam = toQueryParamViaJSON
 
--- | Liceses defined in <https://archlinux.org/packages/core/any/licenses/>,
--- plus special cases listed on the wiki <https://wiki.archlinux.org/title/PKGBUILD#license>.
+-- | SPDX License Identifiers included in <https://archlinux.org/packages/core/any/licenses/>,
 data License
-  = AGPL3
-  | Apache
-  | Artistic2_0
-  | CDDL
-  | CPL
-  | EPL
-  | FDL1_2
-  | FDL1_3
-  | GPL2
-  | GPL3
-  | LGPL2_1
-  | LGPL3
-  | LPPL
-  | MPL
-  | MPL2
-  | PHP
-  | PSF
-  | PerlArtistic
-  | RUBY
+  = AGPL_3_0_only
+  | AGPL_3_0_or_later
+  | Apache_2_0
+  | Artistic_1_0_Perl
+  | Artistic_2_0
+  | BSL_1_0
+  | CC_BY_1_0
+  | CC_BY_2_0
+  | CC_BY_2_5
+  | CC_BY_3_0_AT
+  | CC_BY_3_0_US
+  | CC_BY_3_0
+  | CC_BY_4_0
+  | CC_BY_NC_1_0
+  | CC_BY_NC_2_0
+  | CC_BY_NC_2_5
+  | CC_BY_NC_3_0
+  | CC_BY_NC_4_0
+  | CC_BY_NC_ND_1_0
+  | CC_BY_NC_ND_2_0
+  | CC_BY_NC_ND_2_5
+  | CC_BY_NC_ND_3_0_IGO
+  | CC_BY_NC_ND_3_0
+  | CC_BY_NC_ND_4_0
+  | CC_BY_NC_SA_1_0
+  | CC_BY_NC_SA_2_0
+  | CC_BY_NC_SA_2_5
+  | CC_BY_NC_SA_3_0
+  | CC_BY_NC_SA_4_0
+  | CC_BY_ND_1_0
+  | CC_BY_ND_2_0
+  | CC_BY_ND_2_5
+  | CC_BY_ND_3_0
+  | CC_BY_ND_4_0
+  | CC_BY_SA_1_0
+  | CC_BY_SA_2_0_UK
+  | CC_BY_SA_2_1_JP
+  | CC_BY_SA_2_5
+  | CC_BY_SA_3_0_AT
+  | CC_BY_SA_3_0
+  | CC_BY_SA_4_0
+  | CC_PDDC
+  | CC0_1_0
+  | CDDL_1_0
+  | CDDL_1_1
+  | CPL_1_0
+  | EPL_1_0
+  | EPL_2_0
+  | FSFAP
+  | GFDL_1_1_invariants_only
+  | GFDL_1_1_invariants_or_later
+  | GFDL_1_1_no_invariants_only
+  | GFDL_1_1_no_invariants_or_later
+  | GFDL_1_1_only
+  | GFDL_1_1_or_later
+  | GFDL_1_2_invariants_only
+  | GFDL_1_2_invariants_or_later
+  | GFDL_1_2_no_invariants_only
+  | GFDL_1_2_no_invariants_or_later
+  | GFDL_1_2_only
+  | GFDL_1_2_or_later
+  | GFDL_1_3_invariants_only
+  | GFDL_1_3_invariants_or_later
+  | GFDL_1_3_no_invariants_only
+  | GFDL_1_3_no_invariants_or_later
+  | GFDL_1_3_only
+  | GFDL_1_3_or_later
+  | GPL_1_0_only
+  | GPL_1_0_or_later
+  | GPL_2_0_only
+  | GPL_2_0_or_later
+  | GPL_3_0_only
+  | GPL_3_0_or_later
+  | LGPL_2_0_only
+  | LGPL_2_0_or_later
+  | LGPL_2_1_only
+  | LGPL_2_1_or_later
+  | LGPL_3_0_only
+  | LGPL_3_0_or_later
+  | LGPLLR
+  | LPL_1_0
+  | LPL_1_1
+  | LPL_1_2
+  | LPL_1_3a
+  | LPL_1_3c
+  | MPL_1_0
+  | MPL_1_1
+  | MPL_2_0
+  | PHP_3_0
+  | PHP_3_01
+  | PSF_2_0
+  | Ruby
   | Unlicense
   | W3C
-  | ZPL
-  | BSD
-  | ISC
-  | MIT
-  | ZLIB
-  | Python
-  | OFL
+  | WTFPL
+  | ZPL_1_1
+  | ZPL_2_0
+  | ZPL_2_1
   | Custom Text
   deriving stock (Show, Eq, Ord, Generic)
 
-licenseJSONOption :: Options
-licenseJSONOption =
-  defaultOptions
-    { fieldLabelModifier = T.unpack . T.replace "_" "." . T.pack,
-      sumEncoding = UntaggedValue
-    }
+licenseId :: License -> Text
+licenseId AGPL_3_0_only = "AGPL-3.0-only"
+licenseId AGPL_3_0_or_later = "AGPL-3.0-or-later"
+licenseId Apache_2_0 = "Apache-2.0"
+licenseId Artistic_1_0_Perl = "Artistic-1.0-Perl"
+licenseId Artistic_2_0 = "Artistic-2.0"
+licenseId BSL_1_0 = "BSL-1.0"
+licenseId CC_BY_1_0 = "CC-BY-1.0"
+licenseId CC_BY_2_0 = "CC-BY-2.0"
+licenseId CC_BY_2_5 = "CC-BY-2.5"
+licenseId CC_BY_3_0_AT = "CC-BY-3.0-AT"
+licenseId CC_BY_3_0_US = "CC-BY-3.0-US"
+licenseId CC_BY_3_0 = "CC-BY-3.0"
+licenseId CC_BY_4_0 = "CC-BY-4.0"
+licenseId CC_BY_NC_1_0 = "CC-BY-NC-1.0"
+licenseId CC_BY_NC_2_0 = "CC-BY-NC-2.0"
+licenseId CC_BY_NC_2_5 = "CC-BY-NC-2.5"
+licenseId CC_BY_NC_3_0 = "CC-BY-NC-3.0"
+licenseId CC_BY_NC_4_0 = "CC-BY-NC-4.0"
+licenseId CC_BY_NC_ND_1_0 = "CC-BY-NC-ND-1.0"
+licenseId CC_BY_NC_ND_2_0 = "CC-BY-NC-ND-2.0"
+licenseId CC_BY_NC_ND_2_5 = "CC-BY-NC-ND-2.5"
+licenseId CC_BY_NC_ND_3_0_IGO = "CC-BY-NC-ND-3.0-IGO"
+licenseId CC_BY_NC_ND_3_0 = "CC-BY-NC-ND-3.0"
+licenseId CC_BY_NC_ND_4_0 = "CC-BY-NC-ND-4.0"
+licenseId CC_BY_NC_SA_1_0 = "CC-BY-NC-SA-1.0"
+licenseId CC_BY_NC_SA_2_0 = "CC-BY-NC-SA-2.0"
+licenseId CC_BY_NC_SA_2_5 = "CC-BY-NC-SA-2.5"
+licenseId CC_BY_NC_SA_3_0 = "CC-BY-NC-SA-3.0"
+licenseId CC_BY_NC_SA_4_0 = "CC-BY-NC-SA-4.0"
+licenseId CC_BY_ND_1_0 = "CC-BY-ND-1.0"
+licenseId CC_BY_ND_2_0 = "CC-BY-ND-2.0"
+licenseId CC_BY_ND_2_5 = "CC-BY-ND-2.5"
+licenseId CC_BY_ND_3_0 = "CC-BY-ND-3.0"
+licenseId CC_BY_ND_4_0 = "CC-BY-ND-4.0"
+licenseId CC_BY_SA_1_0 = "CC-BY-SA-1.0"
+licenseId CC_BY_SA_2_0_UK = "CC-BY-SA-2.0-UK"
+licenseId CC_BY_SA_2_1_JP = "CC-BY-SA-2.1-JP"
+licenseId CC_BY_SA_2_5 = "CC-BY-SA-2.5"
+licenseId CC_BY_SA_3_0_AT = "CC-BY-SA-3.0-AT"
+licenseId CC_BY_SA_3_0 = "CC-BY-SA-3.0"
+licenseId CC_BY_SA_4_0 = "CC-BY-SA-4.0"
+licenseId CC_PDDC = "CC-PDDC"
+licenseId CC0_1_0 = "CC0-1.0"
+licenseId CDDL_1_0 = "CDDL-1.0"
+licenseId CDDL_1_1 = "CDDL-1.1"
+licenseId CPL_1_0 = "CPL-1.0"
+licenseId EPL_1_0 = "EPL-1.0"
+licenseId EPL_2_0 = "EPL-2.0"
+licenseId FSFAP = "FSFAP"
+licenseId GFDL_1_1_invariants_only = "GFDL-1.1-invariants-only"
+licenseId GFDL_1_1_invariants_or_later = "GFDL-1.1-invariants-or-later"
+licenseId GFDL_1_1_no_invariants_only = "GFDL-1.1-no-invariants-only"
+licenseId GFDL_1_1_no_invariants_or_later = "GFDL-1.1-no-invariants-or-later"
+licenseId GFDL_1_1_only = "GFDL-1.1-only"
+licenseId GFDL_1_1_or_later = "GFDL-1.1-or-later"
+licenseId GFDL_1_2_invariants_only = "GFDL-1.2-invariants-only"
+licenseId GFDL_1_2_invariants_or_later = "GFDL-1.2-invariants-or-later"
+licenseId GFDL_1_2_no_invariants_only = "GFDL-1.2-no-invariants-only"
+licenseId GFDL_1_2_no_invariants_or_later = "GFDL-1.2-no-invariants-or-later"
+licenseId GFDL_1_2_only = "GFDL-1.2-only"
+licenseId GFDL_1_2_or_later = "GFDL-1.2-or-later"
+licenseId GFDL_1_3_invariants_only = "GFDL-1.3-invariants-only"
+licenseId GFDL_1_3_invariants_or_later = "GFDL-1.3-invariants-or-later"
+licenseId GFDL_1_3_no_invariants_only = "GFDL-1.3-no-invariants-only"
+licenseId GFDL_1_3_no_invariants_or_later = "GFDL-1.3-no-invariants-or-later"
+licenseId GFDL_1_3_only = "GFDL-1.3-only"
+licenseId GFDL_1_3_or_later = "GFDL-1.3-or-later"
+licenseId GPL_1_0_only = "GPL-1.0-only"
+licenseId GPL_1_0_or_later = "GPL-1.0-or-later"
+licenseId GPL_2_0_only = "GPL-2.0-only"
+licenseId GPL_2_0_or_later = "GPL-2.0-or-later"
+licenseId GPL_3_0_only = "GPL-3.0-only"
+licenseId GPL_3_0_or_later = "GPL-3.0-or-later"
+licenseId LGPL_2_0_only = "LGPL-2.0-only"
+licenseId LGPL_2_0_or_later = "LGPL-2.0-or-later"
+licenseId LGPL_2_1_only = "LGPL-2.1-only"
+licenseId LGPL_2_1_or_later = "LGPL-2.1-or-later"
+licenseId LGPL_3_0_only = "LGPL-3.0-only"
+licenseId LGPL_3_0_or_later = "LGPL-3.0-or-later"
+licenseId LGPLLR = "LGPLLR"
+licenseId LPL_1_0 = "LPL-1.0"
+licenseId LPL_1_1 = "LPL-1.1"
+licenseId LPL_1_2 = "LPL-1.2"
+licenseId LPL_1_3a = "LPL-1.3a"
+licenseId LPL_1_3c = "LPL-1.3c"
+licenseId MPL_1_0 = "MPL-1.0"
+licenseId MPL_1_1 = "MPL-1.1"
+licenseId MPL_2_0 = "MPL-2.0"
+licenseId PHP_3_0 = "PHP-3.0"
+licenseId PHP_3_01 = "PHP-3.01"
+licenseId PSF_2_0 = "PSF-2.0"
+licenseId Ruby = "Ruby"
+licenseId Unlicense = "Unlicense"
+licenseId W3C = "W3C"
+licenseId WTFPL = "WTFPL"
+licenseId ZPL_1_1 = "ZPL-1.1"
+licenseId ZPL_2_0 = "ZPL-2.0"
+licenseId ZPL_2_1 = "ZPL-2.1"
+licenseId (Custom x) = "custom:" <> x
 
+parseLicense :: Text -> License
+parseLicense "AGPL-3.0-only" = AGPL_3_0_only
+parseLicense "AGPL-3.0-or-later" = AGPL_3_0_or_later
+parseLicense "Apache-2.0" = Apache_2_0
+parseLicense "Artistic-1.0-Perl" = Artistic_1_0_Perl
+parseLicense "Artistic-2.0" = Artistic_2_0
+parseLicense "BSL-1.0" = BSL_1_0
+parseLicense "CC-BY-1.0" = CC_BY_1_0
+parseLicense "CC-BY-2.0" = CC_BY_2_0
+parseLicense "CC-BY-2.5" = CC_BY_2_5
+parseLicense "CC-BY-3.0-AT" = CC_BY_3_0_AT
+parseLicense "CC-BY-3.0-US" = CC_BY_3_0_US
+parseLicense "CC-BY-3.0" = CC_BY_3_0
+parseLicense "CC-BY-4.0" = CC_BY_4_0
+parseLicense "CC-BY-NC-1.0" = CC_BY_NC_1_0
+parseLicense "CC-BY-NC-2.0" = CC_BY_NC_2_0
+parseLicense "CC-BY-NC-2.5" = CC_BY_NC_2_5
+parseLicense "CC-BY-NC-3.0" = CC_BY_NC_3_0
+parseLicense "CC-BY-NC-4.0" = CC_BY_NC_4_0
+parseLicense "CC-BY-NC-ND-1.0" = CC_BY_NC_ND_1_0
+parseLicense "CC-BY-NC-ND-2.0" = CC_BY_NC_ND_2_0
+parseLicense "CC-BY-NC-ND-2.5" = CC_BY_NC_ND_2_5
+parseLicense "CC-BY-NC-ND-3.0-IGO" = CC_BY_NC_ND_3_0_IGO
+parseLicense "CC-BY-NC-ND-3.0" = CC_BY_NC_ND_3_0
+parseLicense "CC-BY-NC-ND-4.0" = CC_BY_NC_ND_4_0
+parseLicense "CC-BY-NC-SA-1.0" = CC_BY_NC_SA_1_0
+parseLicense "CC-BY-NC-SA-2.0" = CC_BY_NC_SA_2_0
+parseLicense "CC-BY-NC-SA-2.5" = CC_BY_NC_SA_2_5
+parseLicense "CC-BY-NC-SA-3.0" = CC_BY_NC_SA_3_0
+parseLicense "CC-BY-NC-SA-4.0" = CC_BY_NC_SA_4_0
+parseLicense "CC-BY-ND-1.0" = CC_BY_ND_1_0
+parseLicense "CC-BY-ND-2.0" = CC_BY_ND_2_0
+parseLicense "CC-BY-ND-2.5" = CC_BY_ND_2_5
+parseLicense "CC-BY-ND-3.0" = CC_BY_ND_3_0
+parseLicense "CC-BY-ND-4.0" = CC_BY_ND_4_0
+parseLicense "CC-BY-SA-1.0" = CC_BY_SA_1_0
+parseLicense "CC-BY-SA-2.0-UK" = CC_BY_SA_2_0_UK
+parseLicense "CC-BY-SA-2.1-JP" = CC_BY_SA_2_1_JP
+parseLicense "CC-BY-SA-2.5" = CC_BY_SA_2_5
+parseLicense "CC-BY-SA-3.0-AT" = CC_BY_SA_3_0_AT
+parseLicense "CC-BY-SA-3.0" = CC_BY_SA_3_0
+parseLicense "CC-BY-SA-4.0" = CC_BY_SA_4_0
+parseLicense "CC-PDDC" = CC_PDDC
+parseLicense "CC0-1.0" = CC0_1_0
+parseLicense "CDDL-1.0" = CDDL_1_0
+parseLicense "CDDL-1.1" = CDDL_1_1
+parseLicense "CPL-1.0" = CPL_1_0
+parseLicense "EPL-1.0" = EPL_1_0
+parseLicense "EPL-2.0" = EPL_2_0
+parseLicense "FSFAP" = FSFAP
+parseLicense "GFDL-1.1-invariants-only" = GFDL_1_1_invariants_only
+parseLicense "GFDL-1.1-invariants-or-later" = GFDL_1_1_invariants_or_later
+parseLicense "GFDL-1.1-no-invariants-only" = GFDL_1_1_no_invariants_only
+parseLicense "GFDL-1.1-no-invariants-or-later" = GFDL_1_1_no_invariants_or_later
+parseLicense "GFDL-1.1-only" = GFDL_1_1_only
+parseLicense "GFDL-1.1-or-later" = GFDL_1_1_or_later
+parseLicense "GFDL-1.2-invariants-only" = GFDL_1_2_invariants_only
+parseLicense "GFDL-1.2-invariants-or-later" = GFDL_1_2_invariants_or_later
+parseLicense "GFDL-1.2-no-invariants-only" = GFDL_1_2_no_invariants_only
+parseLicense "GFDL-1.2-no-invariants-or-later" = GFDL_1_2_no_invariants_or_later
+parseLicense "GFDL-1.2-only" = GFDL_1_2_only
+parseLicense "GFDL-1.2-or-later" = GFDL_1_2_or_later
+parseLicense "GFDL-1.3-invariants-only" = GFDL_1_3_invariants_only
+parseLicense "GFDL-1.3-invariants-or-later" = GFDL_1_3_invariants_or_later
+parseLicense "GFDL-1.3-no-invariants-only" = GFDL_1_3_no_invariants_only
+parseLicense "GFDL-1.3-no-invariants-or-later" = GFDL_1_3_no_invariants_or_later
+parseLicense "GFDL-1.3-only" = GFDL_1_3_only
+parseLicense "GFDL-1.3-or-later" = GFDL_1_3_or_later
+parseLicense "GPL-1.0-only" = GPL_1_0_only
+parseLicense "GPL-1.0-or-later" = GPL_1_0_or_later
+parseLicense "GPL-2.0-only" = GPL_2_0_only
+parseLicense "GPL-2.0-or-later" = GPL_2_0_or_later
+parseLicense "GPL-3.0-only" = GPL_3_0_only
+parseLicense "GPL-3.0-or-later" = GPL_3_0_or_later
+parseLicense "LGPL-2.0-only" = LGPL_2_0_only
+parseLicense "LGPL-2.0-or-later" = LGPL_2_0_or_later
+parseLicense "LGPL-2.1-only" = LGPL_2_1_only
+parseLicense "LGPL-2.1-or-later" = LGPL_2_1_or_later
+parseLicense "LGPL-3.0-only" = LGPL_3_0_only
+parseLicense "LGPL-3.0-or-later" = LGPL_3_0_or_later
+parseLicense "LGPLLR" = LGPLLR
+parseLicense "LPL-1.0" = LPL_1_0
+parseLicense "LPL-1.1" = LPL_1_1
+parseLicense "LPL-1.2" = LPL_1_2
+parseLicense "LPL-1.3a" = LPL_1_3a
+parseLicense "LPL-1.3c" = LPL_1_3c
+parseLicense "MPL-1.0" = MPL_1_0
+parseLicense "MPL-1.1" = MPL_1_1
+parseLicense "MPL-2.0" = MPL_2_0
+parseLicense "PHP-3.0" = PHP_3_0
+parseLicense "PHP-3.01" = PHP_3_01
+parseLicense "PSF-2.0" = PSF_2_0
+parseLicense "Ruby" = Ruby
+parseLicense "Unlicense" = Unlicense
+parseLicense "W3C" = W3C
+parseLicense "WTFPL" = WTFPL
+parseLicense "ZPL-1.1" = ZPL_1_1
+parseLicense "ZPL-2.0" = ZPL_2_0
+parseLicense "ZPL-2.1" = ZPL_2_1
+parseLicense x = Custom x
+
 instance ToJSON License where
-  toJSON (Custom x) = String $ "custom: " <> x
-  toJSON x =
-    genericToJSON licenseJSONOption x
+  toJSON x = String $ licenseId x
 
 instance FromJSON License where
-  parseJSON = withText "License" $ \txt -> do
-    case T.stripPrefix "custom:" txt of
-      Just c -> pure $ Custom c
-      _ -> genericParseJSON licenseJSONOption (String $ T.stripStart txt)
+  parseJSON = withText "License" $ \txt -> pure (parseLicense txt)
 
 -- | Package details returned by 'Web.ArchLinux.API.getPackageDetails'.
 data PackageInformation = PackageInformation
