diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,6 +1,26 @@
+# 1.1.1
+
+## Other Changes
+
+* Increased upper bound of `base` to allow 4.10.
+
+# 1.1.0
+
+## Breaking Changes
+
+* `ListenData` no longer has an `Ord` instance. This is due to `TrackMetadata` losing its `Ord` instance.
+* `TrackMetadata` has gained `trackReleaseName` and `trackAdditionalInfo` fields.
+* `TrackMetadata` no longer has an `Ord` instance, as `trackAdditionalInfo` is an Aeson `Object` that lacks `Ord`.
+
+## Other Changes
+
+* Documentation!
+
+
 # 1.0.1
 
 Export a few more symbols
+
 
 # 1.0.0
 
diff --git a/listenbrainz-client.cabal b/listenbrainz-client.cabal
--- a/listenbrainz-client.cabal
+++ b/listenbrainz-client.cabal
@@ -1,5 +1,5 @@
 name:                listenbrainz-client
-version:             1.0.1
+version:             1.1.1
 synopsis:            A client library to the ListenBrainz project
 homepage:            https://github.com/ocharles/listenbrainz-client
 license:             BSD3
@@ -14,7 +14,7 @@
 library
   exposed-modules:     Web.ListenBrainz
   build-depends:       aeson >= 1.0.2.1,
-                       base >=4.9 && <4.10,
+                       base >=4.9 && <4.11,
                        free >= 4.12.4,
                        freer-effects >= 0.3.0.1,
                        http-client >= 0.5.7.0,
diff --git a/src/Web/ListenBrainz.hs b/src/Web/ListenBrainz.hs
--- a/src/Web/ListenBrainz.hs
+++ b/src/Web/ListenBrainz.hs
@@ -10,6 +10,7 @@
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE TypeOperators #-}
 
+-- | A basic client to interact with ListenBrainz.
 module Web.ListenBrainz
   ( MonadListenBrainz(..)
   , runListenBrainzEff
@@ -55,8 +56,9 @@
 import Control.Monad.Freer.Exception
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Reader
-import Data.Aeson (FromJSON(..), ToJSON(..), (.=), (.:))
+import Data.Aeson (Object, FromJSON(..), ToJSON(..), (.=), (.:), (.:?))
 import qualified Data.Aeson as JSON
+import Data.Foldable (fold)
 import Data.Functor.Coyoneda
 import Data.Monoid
 import Data.Proxy (Proxy(..))
@@ -108,10 +110,13 @@
           ]
 
 
+-- | Information about a single listen at a point in time.
 data ListenData = ListenData
   { listenListenedAt :: UTCTime
+    -- ^ When this listen was recorded.
   , listenTrackMetadata :: TrackMetadata
-  } deriving (Eq, Ord, Read, Show, Generic)
+    -- ^ Information about the track that was listened to.
+  } deriving (Eq, Read, Show, Generic)
 
 
 instance ToJSON ListenData where
@@ -134,18 +139,27 @@
       pure ListenData{..}
 
 
+-- | Metadata about a track that was listened to.
 data TrackMetadata = TrackMetadata
   { trackArtist :: Text
   , trackName :: Text
-  } deriving (Eq, Ord, Read, Show, Generic)
+  , trackReleaseName :: Maybe Text
+    -- ^ The name of the release this recording was played from.
+  , trackAdditionalInfo :: Object
+    -- ^ Arbitrary and unstructured extra information. For more information, see the [ListenBrainz documentation](https://listenbrainz.readthedocs.io/en/production/dev/json.html#payload-json-details).
+  } deriving (Eq, Read, Show, Generic)
 
 
 instance ToJSON TrackMetadata where
   toJSON TrackMetadata {..} =
     JSON.object
-      [ "artist_name" .= trackArtist
-      , "track_name" .= trackName
-      ]
+      (concat
+        [ [ "artist_name" .= trackArtist
+          , "track_name" .= trackName
+          , "additional_info" .= trackAdditionalInfo
+          ]
+        , foldMap (pure . ("release_name" .=)) trackReleaseName
+        ])
 
 
 instance FromJSON TrackMetadata where
@@ -156,6 +170,12 @@
 
       trackName <-
         o .: "track_name"
+
+      trackReleaseName <-
+        o .:? "release_name"
+
+      trackAdditionalInfo <-
+        fmap fold (o .:? "additional_info")
 
       pure TrackMetadata{..}
 
