diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,6 @@
+## 0.8.0.0
+* Remove data centers. These have been deprecated by Hetzner.
+
 ## 0.7.3.0
 * `Eq` instance for `OSFlavor`.
 * New function: `isSystemImage`.
diff --git a/hetzner.cabal b/hetzner.cabal
--- a/hetzner.cabal
+++ b/hetzner.cabal
@@ -2,7 +2,7 @@
 category: Cloud
 synopsis: Hetzner Cloud and DNS library.
 description: Hetzner Cloud and DNS library. Check the readme and documentation for more details.
-version: 0.7.3.0
+version: 0.8.0.0
 cabal-version: 1.18
 build-type: Simple
 author: Daniel Casanueva (coding `at` danielcasanueva.eu)
@@ -31,7 +31,7 @@
     , TypeApplications
     , CPP
   build-depends:
-      base >= 4.16 && < 4.21
+      base >= 4.16 && < 4.23
     , text, aeson, containers, conduit
     , http-conduit, bytestring, yaml, time
     , country, ip, megaparsec, scientific
diff --git a/src/Hetzner/Cloud.hs b/src/Hetzner/Cloud.hs
--- a/src/Hetzner/Cloud.hs
+++ b/src/Hetzner/Cloud.hs
@@ -56,13 +56,6 @@
   , waitForAction
   , HasActions (..)
   , waitForActions
-    -- ** Datacenters
-  , DatacenterID (..)
-  , DatacenterServers (..)
-  , Datacenter (..)
-  , DatacentersWithRecommendation (..)
-  , getDatacenters
-  , getDatacenter
     -- ** Firewalls
   , FirewallID (..)
   , TrafficDirection (..)
@@ -900,65 +893,6 @@
   actionsOf = foldMap actionsOf
 
 ----------------------------------------------------------------------------------------------------
--- Datacenters
-----------------------------------------------------------------------------------------------------
-
--- | Datacenter identifier.
-newtype DatacenterID = DatacenterID Int deriving (Eq, Ord, Show, FromJSON, ToJSON)
-
--- | Server types available in a datacenter.
-data DatacenterServers = DatacenterServers
-  { availableServers :: [ServerTypeID]
-  , migrationAvailableServers :: [ServerTypeID]
-  , supportedServers :: [ServerTypeID]
-    } deriving Show
-
-instance FromJSON DatacenterServers where
-  parseJSON = JSON.withObject "DatacenterServers" $ \o -> DatacenterServers
-    <$> o .: "available"
-    <*> o .: "available_for_migration"
-    <*> o .: "supported"
-
--- | A datacenter within a location.
-data Datacenter = Datacenter
-  { datacenterID :: DatacenterID
-  , datacenterName :: Text
-  , datacenterDescription :: Text
-  , datacenterLocation :: Location
-  , datacenterServers :: DatacenterServers
-    } deriving Show
-
-instance FromJSON Datacenter where
-  parseJSON = JSON.withObject "Datacenter" $ \o -> Datacenter
-    <$> o .: "id"
-    <*> o .: "name"
-    <*> o .: "description"
-    <*> o .: "location"
-    <*> o .: "server_types"
-
--- | Datacenter list with a datacenter recommendation for new servers.
-data DatacentersWithRecommendation = DatacentersWithRecommendation
-  { datacenters :: [Datacenter]
-    -- | The datacenter which is recommended to be used to create
-    --   new servers.
-  , datacenterRecommendation :: DatacenterID
-    } deriving Show
-
-instance FromJSON DatacentersWithRecommendation where
-  parseJSON = JSON.withObject "DatacentersWithRecommendation" $ \o -> DatacentersWithRecommendation
-    <$> o .: "datacenters"
-    <*> o .: "recommendation"
-
--- | Get all datacenters.
-getDatacenters :: Token -> IO DatacentersWithRecommendation
-getDatacenters token = cloudQuery "GET" "/datacenters" noBody token Nothing
-
--- | Get a single datacenter.
-getDatacenter :: Token -> DatacenterID -> IO Datacenter
-getDatacenter token (DatacenterID i) = withoutKey @"datacenter" <$>
-  cloudQuery "GET" ("/datacenters/" <> fromString (show i)) noBody token Nothing
-
-----------------------------------------------------------------------------------------------------
 -- Firewalls
 ----------------------------------------------------------------------------------------------------
 
@@ -1461,7 +1395,6 @@
   , primaryIPIsBlocked :: Bool
     -- | Point in time where the primary IP was created.
   , primaryIPCreated :: ZonedTime
-  , primaryIPDatacenter :: Datacenter
   , primaryIPID :: PrimaryIPID
     -- | Primary IP together with reverse DNS information.
   , primaryIP :: Either (PublicIPInfo Text IPv4) (PublicIPInfo [PublicIPInfo Text IPv6] IPv6Range)
@@ -1479,7 +1412,6 @@
       <*> o .: "auto_delete"
       <*> o .: "blocked"
       <*> o .: "created"
-      <*> o .: "datacenter"
       <*> o .: "id"
       <*> (case iptype :: Text of
              "ipv4" -> Left <$> (o .: "dns_ptr" >>= JSON.parseJSON . head)
@@ -1762,7 +1694,6 @@
 -- | A server.
 data Server = Server
   { serverCreated :: ZonedTime
-  , serverDatacenter :: Datacenter
   , serverID :: ServerID
   , serverImage :: Image
   , serverLabels :: LabelMap
@@ -1776,7 +1707,6 @@
 instance FromJSON Server where
   parseJSON = JSON.withObject "Server" $ \o -> Server
     <$> o .: "created"
-    <*> o .: "datacenter"
     <*> o .: "id"
     <*> o .: "image"
     <*> o .: "labels"
@@ -1790,7 +1720,7 @@
 data NewServer = NewServer
   { -- | Automount attached volumes.
     newServerAutomount :: Bool
-  , newServerLocation :: Maybe (Either DatacenterID LocationID)
+  , newServerLocation :: Maybe LocationID
   , newServerFirewalls :: [FirewallID]
   , newServerImage :: ImageID
   , newServerLabels :: [Label]
@@ -1812,7 +1742,7 @@
 instance ToJSON NewServer where
   toJSON nserver = JSON.object $ mconcat
     [ pure $ "automount" .= (newServerAutomount nserver && not (null $ newServerVolumes nserver))
-    , maybe mempty (pure . either ("datacenter".=) ("location".=)) $ newServerLocation nserver
+    , maybe mempty (pure . ("location".=)) $ newServerLocation nserver
     , pure $ "firewalls" .=
         fmap (\fwid -> JSON.object [ "firewall" .= fwid ]) (newServerFirewalls nserver)
     , pure $ "image" .= newServerImage nserver
