diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+__v0.9.4__
+
+derive generic
+
 __v0.9.3__
 
 Add lenses
diff --git a/pinboard.cabal b/pinboard.cabal
--- a/pinboard.cabal
+++ b/pinboard.cabal
@@ -1,5 +1,5 @@
 name:                pinboard
-version:             0.9.3
+version:             0.9.4
 synopsis:            Access to the Pinboard API
 license:             MIT
 license-file:        LICENSE
diff --git a/src/Pinboard/ApiTypes.hs b/src/Pinboard/ApiTypes.hs
--- a/src/Pinboard/ApiTypes.hs
+++ b/src/Pinboard/ApiTypes.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -20,6 +21,7 @@
 import Data.Text           (Text, words, unwords, unpack, pack)
 import Data.Time           (UTCTime)
 import Data.Time.Calendar  (Day)
+import GHC.Generics        (Generic)
 
 import qualified Data.HashMap.Strict as HM
 import qualified Data.Vector as V
@@ -41,7 +43,7 @@
       postsDate         :: !UTCTime
     , postsUser         :: !Text
     , postsPosts        :: [Post]
-    } deriving (Show, Eq, Data, Typeable, Ord)
+    } deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON Posts where
    parseJSON (Object o) =
@@ -66,7 +68,7 @@
     , postShared       :: !Bool
     , postToRead       :: !Bool
     , postTags         :: [Tag]
-    } deriving (Show, Eq, Data, Typeable, Ord)
+    } deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON Post where
    parseJSON (Object o) =
@@ -105,7 +107,7 @@
       postDatesUser     :: !Text
     , postDatesTag      :: !Text
     , postDatesCount    :: [(Day, Int)]
-    } deriving (Show, Eq, Data, Typeable, Ord)
+    } deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON PostDates where
    parseJSON (Object o) =
@@ -135,7 +137,7 @@
 data NoteList = NoteList {
       noteListCount     :: !Int
     , noteListItems     :: [NoteListItem]
-    } deriving (Show, Eq, Data, Typeable, Ord)
+    } deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON NoteList where
    parseJSON (Object o) =
@@ -155,7 +157,7 @@
     , noteListItemLength :: !Int
     , noteListItemCreatedAt :: !UTCTime
     , noteListItemUpdatedAt :: !UTCTime
-    } deriving (Show, Eq, Data, Typeable, Ord)
+    } deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON NoteListItem where
    parseJSON (Object o) =
@@ -185,7 +187,7 @@
     , noteLength :: !Int
     , noteCreatedAt :: !UTCTime
     , noteUpdatedAt :: !UTCTime
-    } deriving (Show, Eq, Data, Typeable, Ord)
+    } deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON Note where
    parseJSON (Object o) =
@@ -225,7 +227,7 @@
 type TagMap = HashMap Tag Int
 
 newtype JsonTagMap = ToJsonTagMap {fromJsonTagMap :: TagMap}
-    deriving (Show, Eq, Data, Typeable)
+  deriving (Show, Eq, Data, Typeable, Generic)
 
 instance FromJSON JsonTagMap where
   parseJSON = return . toTags
@@ -238,7 +240,7 @@
 
 data Suggested = Popular [Text]
                | Recommended [Text]
-    deriving (Show, Eq, Data, Typeable, Ord)
+    deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON Suggested where
    parseJSON (Object o)
@@ -258,7 +260,7 @@
 -- * Scalars
 
 newtype DoneResult = ToDoneResult {fromDoneResult :: ()}
-    deriving (Show, Eq, Data, Typeable, Ord)
+    deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON DoneResult where
   parseJSON (Object o) = parseDone =<< (o .: "result" <|> o .: "result_code")
@@ -269,14 +271,14 @@
   parseJSON _ = error "bad parse"
 
 newtype TextResult = ToTextResult {fromTextResult :: Text}
-    deriving (Show, Eq, Data, Typeable, Ord)
+    deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON TextResult where
   parseJSON (Object o) = ToTextResult <$> (o .: "result")
   parseJSON _ = error "bad parse"
 
 newtype UpdateTime = ToUpdateTime {fromUpdateTime :: UTCTime}
-    deriving (Show, Eq, Data, Typeable, Ord)
+    deriving (Show, Eq, Data, Typeable, Generic, Ord)
 
 instance FromJSON UpdateTime where
   parseJSON (Object o) = ToUpdateTime <$> (o .: "update_time")
diff --git a/src/Pinboard/ApiTypesLens.hs b/src/Pinboard/ApiTypesLens.hs
--- a/src/Pinboard/ApiTypesLens.hs
+++ b/src/Pinboard/ApiTypesLens.hs
@@ -441,6 +441,7 @@
            (Popular y1_acHt) -> Right y1_acHt
            _ -> Left x_acHs) 
           (either pure (fmap Popular)) . right'
+{-# INLINE popularP #-}
       
 
 recommendedP :: Prism_' Suggested [Text]
@@ -449,4 +450,5 @@
            (Recommended y1_acHw) -> Right y1_acHw
            _ -> Left x_acHv)
           (either pure (fmap Recommended)) . right' 
+{-# INLINE recommendedP #-}
 
diff --git a/src/Pinboard/Client.hs b/src/Pinboard/Client.hs
--- a/src/Pinboard/Client.hs
+++ b/src/Pinboard/Client.hs
@@ -155,7 +155,7 @@
 buildReq url = do
   req <- liftIO $ parseUrl $ "https://api.pinboard.in/v1/" <> url
   return $ req 
-    { requestHeaders = [("User-Agent","pinboard.hs/0.9.3")]
+    { requestHeaders = [("User-Agent","pinboard.hs/0.9.4")]
     , checkStatus = \_ _ _ -> Nothing
     }
 
