diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,6 +9,7 @@
 
 matrix:
   allow_failures:
+    - env: GHCVER=7.4.2
     - env: GHCVER=head
 
 before_install:
diff --git a/Web/Twitter/Types.hs b/Web/Twitter/Types.hs
--- a/Web/Twitter/Types.hs
+++ b/Web/Twitter/Types.hs
@@ -32,6 +32,8 @@
        , Place(..)
        , BoundingBox(..)
        , Contributor(..)
+       , UploadedMedia (..)
+       , ImageSizeType (..)
        , checkError
        )
        where
@@ -80,6 +82,8 @@
         js = parseJSON v
     parseJSON _ = mzero
 
+-- | This type represents a Twitter tweet structure.
+-- See <https://dev.twitter.com/docs/platform-objects/tweets>.
 data Status = Status
     { statusContributors :: Maybe [Contributor]
     , statusCoordinates :: Maybe Coordinates
@@ -301,6 +305,8 @@
                <*> s .: "user_id"
     parseJSON _ = mzero
 
+-- | This type represents the Twitter user.
+-- See <https://dev.twitter.com/docs/platform-objects/users>.
 data User = User
     { userContributorsEnabled :: Bool
     , userCreatedAt :: DateString
@@ -410,6 +416,8 @@
              <*> o .:  "user"
     parseJSON _ = mzero
 
+-- | Hashtag entity.
+-- See <https://dev.twitter.com/docs/platform-objects/entities#obj-hashtags>.
 data HashTagEntity =
     HashTagEntity
     { hashTagText :: Text -- ^ The Hashtag text
@@ -420,6 +428,8 @@
         HashTagEntity <$> o .: "text"
     parseJSON _ = mzero
 
+-- | User mention entity.
+-- See <https://dev.twitter.com/docs/platform-objects/entities#obj-usermention>.
 data UserEntity =
     UserEntity
     { userEntityUserId              :: UserId
@@ -434,6 +444,8 @@
                    <*> o .:  "screen_name"
     parseJSON _ = mzero
 
+-- | URL entity.
+-- See <https://dev.twitter.com/docs/platform-objects/entities#obj-url>.
 data URLEntity =
     URLEntity
     { ueURL      :: URIString -- ^ The URL that was extracted
@@ -468,6 +480,8 @@
                     <*> parseJSON v
     parseJSON _ = mzero
 
+-- | Size entity.
+-- See <https://dev.twitter.com/docs/platform-objects/entities#obj-size>.
 data MediaSize =
     MediaSize
     { msWidth :: Int
@@ -494,6 +508,8 @@
                     <*> o .: "type"
     parseJSON _ = mzero
 
+-- | This type represents a place, named locations with corresponding geo coordinates.
+-- See <https://dev.twitter.com/docs/platform-objects/places>.
 data Place =
     Place
     { placeAttributes   :: HashMap Text Text
@@ -520,6 +536,8 @@
               <*> o .: "url"
     parseJSON _ = mzero
 
+-- | A bounding box of coordinates which encloses the place.
+-- See <https://dev.twitter.com/docs/platform-objects/places#obj-boundingbox>.
 data BoundingBox =
     BoundingBox
     { boundingBoxCoordinates  :: [[[Double]]]
@@ -533,6 +551,7 @@
     parseJSON _ = mzero
 
 -- | Entity handling.
+-- See <https://dev.twitter.com/docs/platform-objects/entities>.
 data Entities =
     Entities
     { enHashTags     :: [Entity HashTagEntity]
@@ -577,3 +596,30 @@
         Contributor <$>  o .:  "id"
                     <*>  o .:  "screen_name"
     parseJSON _ = mzero
+
+-- | Image size type. This type is included in the API response of \"\/1.1\/media\/upload.json\".
+data ImageSizeType = ImageSizeType
+    { imageSizeTypeWidth :: Int
+    , imageSizeTypeHeight :: Int
+    , imageSizeTypeType :: Text
+    } deriving Show
+instance FromJSON ImageSizeType where
+    parseJSON (Object o) =
+        ImageSizeType <$> o .:  "w"
+                      <*> o .:  "h"
+                      <*> o .:  "image_type"
+    parseJSON v = fail $ "unknown value: " ++ show v
+
+-- | This type is represents the API response of \"\/1.1\/media\/upload.json\".
+-- See <https://dev.twitter.com/docs/api/multiple-media-extended-entities>.
+data UploadedMedia = UploadedMedia
+    { uploadedMediaId :: Integer
+    , uploadedMediaSize :: Integer
+    , uploadedMediaImage :: ImageSizeType
+    } deriving Show
+instance FromJSON UploadedMedia where
+    parseJSON (Object o) =
+        UploadedMedia <$> o .:  "media_id"
+                      <*> o .:  "size"
+                      <*> o .:  "image"
+    parseJSON v = fail $ "unknown value: " ++ show v
diff --git a/Web/Twitter/Types/Lens.hs b/Web/Twitter/Types/Lens.hs
--- a/Web/Twitter/Types/Lens.hs
+++ b/Web/Twitter/Types/Lens.hs
@@ -2,37 +2,15 @@
 {-# LANGUAGE OverloadedStrings, DeriveDataTypeable, RankNTypes, CPP, FlexibleInstances #-}
 
 module Web.Twitter.Types.Lens
-       ( TT.DateString
-       , TT.UserId
-       , TT.Friends
-       , TT.URIString
-       , TT.UserName
-       , TT.StatusId
-       , TT.LanguageCode
-       , TT.StreamingAPI(..)
-       , TT.Status
-       , TT.SearchResult
-       , TT.SearchStatus
-       , TT.SearchMetadata
-       , TT.RetweetedStatus
-       , TT.DirectMessage
-       , TT.EventTarget(..)
-       , TT.Event
-       , TT.Delete
-       , TT.User
-       , TT.List
-       , TT.Entities
-       , TT.EntityIndices
-       , TT.Entity
-       , TT.HashTagEntity
-       , TT.UserEntity
-       , TT.URLEntity
-       , TT.MediaEntity
-       , TT.MediaSize
-       , TT.Coordinates
-       , TT.Place
-       , TT.BoundingBox
+       (
+       -- * Type classes
+         AsStatus(..)
+       , AsUser(..)
+       , HasCreatedAt(..)
+       , AsImageSize(..)
 
+       -- * 'TT.Status'
+       , TT.Status
        , statusContributors
        , statusCoordinates
        , statusCreatedAt
@@ -61,9 +39,13 @@
        , statusWithheldInCountries
        , statusWithheldScope
 
+       -- * 'TT.SearchResult'
+       , TT.SearchResult
        , searchResultStatuses
        , searchResultSearchMetadata
 
+       -- * 'TT.SearchStatus'
+       , TT.SearchStatus
        , searchStatusCreatedAt
        , searchStatusId
        , searchStatusText
@@ -71,6 +53,8 @@
        , searchStatusUser
        , searchStatusCoordinates
 
+       -- * 'TT.SearchMetadata'
+       , TT.SearchMetadata
        , searchMetadataMaxId
        , searchMetadataSinceId
        , searchMetadataRefreshURL
@@ -81,6 +65,8 @@
        , searchMetadataQuery
        , searchMetadataMaxIdStr
 
+       -- * 'TT.RetweetedStatus'
+       , TT.RetweetedStatus
        , rsCreatedAt
        , rsId
        , rsText
@@ -91,6 +77,8 @@
        , rsRetweetedStatus
        , rsCoordinates
 
+       -- * 'TT.DirectMessage'
+       , TT.DirectMessage
        , dmCreatedAt
        , dmSenderScreenName
        , dmSender
@@ -102,15 +90,21 @@
        , dmSenderId
        , dmCoordinates
 
+       -- * 'TT.Event'
+       , TT.Event
        , evCreatedAt
        , evTargetObject
        , evEvent
        , evTarget
        , evSource
 
+       -- * 'TT.Delete'
+       , TT.Delete
        , delId
        , delUserId
 
+       -- * 'TT.User'
+       , TT.User
        , userContributorsEnabled
        , userCreatedAt
        , userDefaultProfile
@@ -152,6 +146,8 @@
        , userWithheldInCountries
        , userWithheldScope
 
+       -- * 'TT.List'
+       , TT.List
        , listId
        , listName
        , listFullName
@@ -160,16 +156,36 @@
        , listMode
        , listUser
 
+       -- * 'TT.Entities'
+       , TT.Entities
+       , enHashTags
+       , enUserMentions
+       , enURLs
+       , enMedia
+
+       -- * 'TT.Entity'
+       , TT.Entity
+       , entityBody
+       , entityIndices
+
+       -- * 'TT.HashTagEntity'
+       , TT.HashTagEntity
        , hashTagText
 
+       -- * 'TT.UserEntity'
+       , TT.UserEntity
        , userEntityUserId
        , userEntityUserName
        , userEntityUserScreenName
 
+       -- * 'TT.URLEntity'
+       , TT.URLEntity
        , ueURL
        , ueExpanded
        , ueDisplay
 
+       -- * 'TT.MediaEntity'
+       , TT.MediaEntity
        , meType
        , meId
        , meSizes
@@ -177,13 +193,19 @@
        , meMediaURLHttps
        , meURL
 
+       -- * 'TT.MediaSize'
+       , TT.MediaSize
        , msWidth
        , msHeight
        , msResize
 
+       -- * 'TT.Coordinates'
+       , TT.Coordinates
        , coordinates
        , coordinatesType
 
+       -- * 'TT.Place'
+       , TT.Place
        , placeAttributes
        , placeBoundingBox
        , placeCountry
@@ -194,19 +216,39 @@
        , placeType
        , placeURL
 
+       -- * 'TT.BoundingBox'
+       , TT.BoundingBox
        , boundingBoxCoordinates
        , boundingBoxType
 
-       , enHashTags
-       , enUserMentions
-       , enURLs
-       , enMedia
+       -- * 'TT.Contributor'
+       , TT.Contributor
+       , contributorId
+       , contributorScreenName
 
-       , entityBody
-       , entityIndices
+       -- * 'TT.UploadedMedia'
+       , TT.UploadedMedia
+       , uploadedMediaId
+       , uploadedMediaSize
+       , uploadedMediaImage
 
-       , AsStatus(..)
-       , AsUser(..)
+       -- * 'TT.ImageSizeType'
+       , TT.ImageSizeType
+       , imageSizeTypeWidth
+       , imageSizeTypeHeight
+       , imageSizeTypeType
+
+       -- * Type aliases and sum types
+       , TT.DateString
+       , TT.UserId
+       , TT.Friends
+       , TT.URIString
+       , TT.UserName
+       , TT.StatusId
+       , TT.LanguageCode
+       , TT.StreamingAPI(..)
+       , TT.EventTarget(..)
+       , TT.EntityIndices
        )
        where
 
@@ -225,6 +267,8 @@
 makeLenses ''TT.Delete
 makeLenses ''TT.User
 makeLenses ''TT.List
+makeLenses ''TT.Entities
+makeLenses ''TT.Entity
 makeLenses ''TT.HashTagEntity
 makeLenses ''TT.UserEntity
 makeLenses ''TT.URLEntity
@@ -233,42 +277,38 @@
 makeLenses ''TT.Coordinates
 makeLenses ''TT.Place
 makeLenses ''TT.BoundingBox
-makeLenses ''TT.Entities
-makeLenses ''TT.Entity
+makeLenses ''TT.Contributor
+makeLenses ''TT.ImageSizeType
+makeLenses ''TT.UploadedMedia
 
 class AsStatus s where
     status_id :: Lens' s TT.StatusId
     text :: Lens' s Text
     user :: Lens' s TT.User
-    created_at :: Lens' s TT.DateString
     geolocation :: Lens' s (Maybe TT.Coordinates)
 
 instance AsStatus TT.Status where
     status_id = statusId
     text = statusText
     user = statusUser
-    created_at = statusCreatedAt
     geolocation = statusCoordinates
 
 instance AsStatus TT.SearchStatus where
     status_id = searchStatusId
     text = searchStatusText
     user = searchStatusUser
-    created_at = searchStatusCreatedAt
     geolocation = searchStatusCoordinates
 
 instance AsStatus TT.RetweetedStatus where
     status_id = rsId
     text = rsText
     user = rsUser
-    created_at = rsCreatedAt
     geolocation = rsCoordinates
 
 instance AsStatus TT.DirectMessage where
     status_id = dmId
     text = dmText
     user = dmSender
-    created_at = dmCreatedAt
     geolocation = dmCoordinates
 
 class AsUser u where
@@ -290,3 +330,26 @@
     user_id = entityBody.userEntityUserId
     name = entityBody.userEntityUserName
     screen_name = entityBody.userEntityUserScreenName
+
+class HasCreatedAt a where
+    created_at :: Lens' a TT.DateString
+instance HasCreatedAt TT.Status where
+    created_at = statusCreatedAt
+instance HasCreatedAt TT.SearchStatus where
+    created_at = searchStatusCreatedAt
+instance HasCreatedAt TT.RetweetedStatus where
+    created_at = rsCreatedAt
+instance HasCreatedAt TT.DirectMessage where
+    created_at = dmCreatedAt
+instance HasCreatedAt TT.User where
+    created_at = userCreatedAt
+
+class AsImageSize a where
+    width :: Lens' a Int
+    height :: Lens' a Int
+instance AsImageSize TT.MediaSize where
+    width = msWidth
+    height = msHeight
+instance AsImageSize TT.ImageSizeType where
+    width = imageSizeTypeWidth
+    height = imageSizeTypeHeight
diff --git a/twitter-types.cabal b/twitter-types.cabal
--- a/twitter-types.cabal
+++ b/twitter-types.cabal
@@ -1,5 +1,5 @@
 name:              twitter-types
-version:           0.4.20140809
+version:           0.5.0
 license:           BSD3
 license-file:      LICENSE
 author:            Takahiro HIMURA
