diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,92 @@
 # Change Log
 
+## [0.4.0](https://github.com/brendanhay/gogol/tree/0.4.0)
+
+Released: **04 February, 2019**, Compare: [0.4.0](https://github.com/brendanhay/gogol/compare/0.3.0...0.4.0)
+
+### Added
+
+- Added 3 examples of Google Sheets [\#80](https://github.com/brendanhay/gogol/pull/80)
+- Support service account user impersonation [\#78](https://github.com/brendanhay/gogol/pull/78)
+
+### Fixed
+
+- Fixed tinylog typo [\#76](https://github.com/brendanhay/gogol/pull/76)
+- Fix import conflicts for servant 0.13 [\#96](https://github.com/brendanhay/gogol/pull/96)
+- Updated dependencies
+
+## New Libraries
+
+- `gogol-abusiveexperiencereport`
+- `gogol-acceleratedmobilepageurl`
+- `gogol-accesscontextmanager`
+- `gogol-adexchangebuyer2`
+- `gogol-adexperiencereport`
+- `gogol-alertcenter`
+- `gogol-analyticsreporting`
+- `gogol-androiddeviceprovisioning`
+- `gogol-androidmanagement`
+- `gogol-bigquerydatatransfer`
+- `gogol-bigtableadmin`
+- `gogol-binaryauthorization`
+- `gogol-chat`
+- `gogol-cloudasset`
+- `gogol-clouderrorreporting`
+- `gogol-cloudfunctions`
+- `gogol-cloudidentity`
+- `gogol-cloudiot`
+- `gogol-cloudkms`
+- `gogol-cloudprofiler`
+- `gogol-cloudscheduler`
+- `gogol-cloudsearch`
+- `gogol-cloudshell`
+- `gogol-cloudtasks`
+- `gogol-composer`
+- `gogol-consumersurveys`
+- `gogol-containeranalysis`
+- `gogol-dialogflow`
+- `gogol-digitalassetlinks`
+- `gogol-dlp`
+- `gogol-driveactivity`
+- `gogol-file`
+- `gogol-firebasehosting`
+- `gogol-firebaseremoteconfig`
+- `gogol-firestore`
+- `gogol-iamcredentials`
+- `gogol-iap`
+- `gogol-indexing`
+- `gogol-jobs`
+- `gogol-libraryagent`
+- `gogol-oslogin`
+- `gogol-photoslibrary`
+- `gogol-playcustomapp`
+- `gogol-poly`
+- `gogol-redis`
+- `gogol-remotebuildexecution`
+- `gogol-searchconsole`
+- `gogol-servicebroker`
+- `gogol-serviceconsumermanagement`
+- `gogol-servicenetworking`
+- `gogol-serviceusage`
+- `gogol-serviceuser`
+- `gogol-sourcerepo`
+- `gogol-spanner`
+- `gogol-speech`
+- `gogol-streetviewpublish`
+- `gogol-surveys`
+- `gogol-testing`
+- `gogol-texttospeech`
+- `gogol-toolresults`
+- `gogol-tpu`
+- `gogol-tracing`
+- `gogol-vault`
+- `gogol-videointelligence`
+- `gogol-websecurityscanner`
+
+### Updated Service Definitions
+
+- All service definitions have been updated to their latest respective versions.
+
 ## [0.3.0](https://github.com/brendanhay/gogol/tree/0.3.0)
 
 Released: **12 July, 2017**, Compare: [0.3.0](https://github.com/brendanhay/gogol/compare/0.2.0...0.3.0)
diff --git a/gogol.cabal b/gogol.cabal
--- a/gogol.cabal
+++ b/gogol.cabal
@@ -1,5 +1,5 @@
 name:                  gogol
-version:               0.3.0
+version:               0.4.0
 synopsis:              Comprehensive Google Services SDK.
 homepage:              https://github.com/brendanhay/gogol
 bug-reports:           https://github.com/brendanhay/gogol/issues
@@ -66,21 +66,20 @@
         , directory            >= 1.2
         , exceptions           >= 0.6
         , filepath             >= 1.2
-        , gogol-core           == 0.3.0.*
+        , gogol-core           == 0.4.0.*
         , http-client          >= 0.5 && < 1
-        , http-conduit         >= 2.2 && < 3
+        , http-conduit         >= 2.3 && < 3
         , http-media           >= 0.6
         , http-types           >= 0.8.6
         , lens                 >= 4.4
         , memory               >= 0.8
         , mime-types           >= 0.1
-        , monad-control        >= 1
         , mtl                  >= 2.1.3.1
         , resourcet            >= 1.1
         , text                 >= 1.1
         , time                 >= 1.2
         , transformers         >= 0.2
-        , transformers-base    >= 0.4
+        , unliftio-core        >= 0.1
         , unordered-containers >= 0.2.5
         , x509                 >= 1.5
         , x509-store           >= 1.5
diff --git a/src/Network/Google.hs b/src/Network/Google.hs
--- a/src/Network/Google.hs
+++ b/src/Network/Google.hs
@@ -114,33 +114,34 @@
     , module Network.Google.Types
     ) where
 
-import           Control.Applicative
-import           Control.Exception.Lens
-import           Control.Monad
-import           Control.Monad.Base
-import           Control.Monad.Catch
-import           Control.Monad.Reader
-import qualified Control.Monad.RWS.Lazy         as LRW
-import qualified Control.Monad.RWS.Strict       as RW
-import qualified Control.Monad.State.Lazy       as LS
-import qualified Control.Monad.State.Strict     as S
-import           Control.Monad.Trans.Control
-import           Control.Monad.Trans.Except     (ExceptT)
-import           Control.Monad.Trans.Identity   (IdentityT)
-import           Control.Monad.Trans.List       (ListT)
-import           Control.Monad.Trans.Maybe      (MaybeT)
-import           Control.Monad.Trans.Resource
-import qualified Control.Monad.Writer.Lazy      as LW
-import qualified Control.Monad.Writer.Strict    as W
-import           Network.Google.Auth
-import           Network.Google.Env
-import           Network.Google.Internal.Body
-import           Network.Google.Internal.HTTP
-import           Network.Google.Internal.Logger
-import           Network.Google.Prelude
-import           Network.Google.Types
-import           Network.HTTP.Conduit           (newManager, tlsManagerSettings)
+import Control.Applicative
+import Control.Exception.Lens
+import Control.Monad
+import Control.Monad.Catch
+import Control.Monad.IO.Unlift      (MonadUnliftIO (withRunInIO))
+import Control.Monad.Reader
+import Control.Monad.Trans.Except   (ExceptT)
+import Control.Monad.Trans.Identity (IdentityT)
+import Control.Monad.Trans.List     (ListT)
+import Control.Monad.Trans.Maybe    (MaybeT)
+import Control.Monad.Trans.Resource
 
+import Network.Google.Auth
+import Network.Google.Env
+import Network.Google.Internal.Body
+import Network.Google.Internal.HTTP
+import Network.Google.Internal.Logger
+import Network.Google.Prelude
+import Network.Google.Types
+import Network.HTTP.Conduit           (newManager, tlsManagerSettings)
+
+import qualified Control.Monad.Writer.Lazy   as LW
+import qualified Control.Monad.Writer.Strict as W
+import qualified Control.Monad.RWS.Lazy      as LRW
+import qualified Control.Monad.RWS.Strict    as RW
+import qualified Control.Monad.State.Lazy    as LS
+import qualified Control.Monad.State.Strict  as S
+
 -- | The 'Google' monad containing configuration environment and tracks
 -- resource allocation via 'ResourceT'.
 -- The functions in "Network.Google" are generalised
@@ -155,7 +156,6 @@
         , MonadThrow
         , MonadCatch
         , MonadMask
-        , MonadBase IO
         , MonadReader (Env s)
         , MonadResource
         )
@@ -183,11 +183,11 @@
 instance AllowScopes s => MonadGoogle s (Google s) where
     liftGoogle = id
 
-instance MonadBaseControl IO (Google s) where
-    type StM (Google s) a = StM (ReaderT (Env s) (ResourceT IO)) a
-
-    liftBaseWith f = Google $ liftBaseWith $ \g -> f (g . unGoogle)
-    restoreM       = Google . restoreM
+instance MonadUnliftIO (Google s) where
+    withRunInIO inner =
+        Google $ withRunInIO $ \run ->
+            inner (run . unGoogle)
+    {-# INLINE withRunInIO #-}
 
 instance MonadGoogle s m => MonadGoogle s (IdentityT m) where
     liftGoogle = lift . liftGoogle
@@ -440,6 +440,6 @@
 The 'newLogger' function can be used to construct a simple logger which writes
 output to a 'Handle', but in most production code you should probably consider
 using a more robust logging library such as
-<http://hackage.haskell.org/package/tiny-log tiny-log> or
+<http://hackage.haskell.org/package/tinylog tinylog> or
 <http://hackage.haskell.org/package/fast-logger fast-logger>.
 -}
diff --git a/src/Network/Google/Auth.hs b/src/Network/Google/Auth.hs
--- a/src/Network/Google/Auth.hs
+++ b/src/Network/Google/Auth.hs
@@ -25,6 +25,9 @@
     , saveAuthorizedUserToWellKnownPath
     , saveAuthorizedUser
 
+    -- ** Service account user impersonation
+    , serviceAccountUser
+
     -- ** Installed Application Credentials
     , installedApplication
     , formURL
@@ -60,7 +63,7 @@
     -- * Re-exported Types
     , AccessToken    (..)
     , RefreshToken   (..)
-    , Secret         (..)
+    , GSecret        (..)
     , ServiceId      (..)
     , ClientId       (..)
 
@@ -163,10 +166,10 @@
 exchange c l = fmap (Auth c) . action l
   where
     action = case c of
-        FromMetadata s    -> metadataToken       s
-        FromAccount  a    -> serviceAccountToken a (Proxy :: Proxy s)
-        FromClient   x n  -> exchangeCode        x n
-        FromUser     u    -> authorizedUserToken u Nothing
+        FromMetadata s   -> metadataToken       s
+        FromAccount  a   -> serviceAccountToken a (Proxy :: Proxy s)
+        FromClient   x n -> exchangeCode        x n
+        FromUser     u   -> authorizedUserToken u Nothing
 
 -- | Refresh an existing 'OAuthToken'.
 refresh :: forall m s. (MonadIO m, MonadCatch m, AllowScopes s)
@@ -198,3 +201,13 @@
             , "Bearer " <> toHeader (_tokenAccess t)
             ) : Client.requestHeaders rq
         }
+
+-- | Set the user to be impersonated for a service account with domain
+-- wide delegation. See
+-- https://developers.google.com/identity/protocols/OAuth2ServiceAccount
+serviceAccountUser :: forall s. (AllowScopes s)
+                   => Maybe Text
+                   -> Credentials s
+                   -> Credentials s
+serviceAccountUser u (FromAccount s) = FromAccount $ s { _serviceAccountUser = u }
+serviceAccountUser _ c               = c
diff --git a/src/Network/Google/Auth/ServiceAccount.hs b/src/Network/Google/Auth/ServiceAccount.hs
--- a/src/Network/Google/Auth/ServiceAccount.hs
+++ b/src/Network/Google/Auth/ServiceAccount.hs
@@ -125,10 +125,10 @@
             , "kid" .= _serviceKeyId s
             ]
 
-        payload = base64Encode
+        payload = base64Encode $
             [ "aud"   .= tokenURL
             , "scope" .= concatScopes (allowScopes p)
             , "iat"   .= n
             , "exp"   .= (n + seconds maxTokenLifetime)
             , "iss"   .= _serviceEmail s
-            ]
+            ] <> maybe [] (\sub -> ["sub" .= sub]) (_serviceAccountUser s)
diff --git a/src/Network/Google/Internal/Auth.hs b/src/Network/Google/Internal/Auth.hs
--- a/src/Network/Google/Internal/Auth.hs
+++ b/src/Network/Google/Internal/Auth.hs
@@ -91,10 +91,11 @@
 /See:/ <https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority Delegating authority to your service account>.
 -}
 data ServiceAccount = ServiceAccount
-    { _serviceId         :: !ClientId
-    , _serviceEmail      :: !Text
-    , _serviceKeyId      :: !Text
-    , _servicePrivateKey :: !PrivateKey
+    { _serviceId          :: !ClientId
+    , _serviceEmail       :: !Text
+    , _serviceKeyId       :: !Text
+    , _servicePrivateKey  :: !PrivateKey
+    , _serviceAccountUser :: !(Maybe Text)
     } deriving (Eq, Show)
 
 instance FromJSON ServiceAccount where
@@ -109,6 +110,7 @@
             <*> o .: "client_email"
             <*> o .: "private_key_id"
             <*> pure k
+            <*> pure Nothing
 
 {-| Authorized User credentials which are typically generated by the Cloud SDK
 Tools such as @gcloud init@, of the following form:
@@ -126,7 +128,7 @@
 data AuthorizedUser = AuthorizedUser
     { _userId      :: !ClientId
     , _userRefresh :: !RefreshToken
-    , _userSecret  :: !Secret
+    , _userSecret  :: !GSecret
     } deriving (Eq, Show)
 
 instance ToJSON AuthorizedUser where
@@ -145,7 +147,7 @@
 -- | A client identifier and accompanying secret used to obtain/refresh a token.
 data OAuthClient = OAuthClient
     { _clientId     :: !ClientId
-    , _clientSecret :: !Secret
+    , _clientSecret :: !GSecret
     } deriving (Eq, Show)
 
 {-| An OAuth bearer type token of the following form:
diff --git a/src/Network/Google/Internal/HTTP.hs b/src/Network/Google/Internal/HTTP.hs
--- a/src/Network/Google/Internal/HTTP.hs
+++ b/src/Network/Google/Internal/HTTP.hs
@@ -15,28 +15,32 @@
 --
 module Network.Google.Internal.HTTP where
 
-import           Control.Lens                      ((%~), (&))
-import           Control.Monad.Catch
-import           Control.Monad.IO.Class            (MonadIO)
-import           Control.Monad.Trans.Resource      (MonadResource (..))
-import qualified Data.ByteString.Lazy              as LBS
-import           Data.Conduit                      (($$+-))
-import qualified Data.Conduit.List                 as Conduit
-import           Data.Monoid                       (Dual (..), Endo (..), (<>))
-import qualified Data.Text.Encoding                as Text
-import qualified Data.Text.Lazy                    as LText
-import qualified Data.Text.Lazy.Builder            as Build
-import           GHC.Exts                          (toList)
-import           Network.Google.Auth               (AllowScopes, authorize)
-import           Network.Google.Env                (Env (..))
-import           Network.Google.Internal.Logger    (logDebug)
-import           Network.Google.Internal.Multipart
-import           Network.Google.Types
-import qualified Network.HTTP.Client.Conduit       as Client
-import           Network.HTTP.Conduit
-import           Network.HTTP.Media                (RenderHeader (..))
-import           Network.HTTP.Types
+import Control.Lens                 ((%~), (&))
+import Control.Monad.Catch
+import Control.Monad.IO.Class       (MonadIO)
+import Control.Monad.Trans.Resource (MonadResource (..))
 
+import Data.Conduit (($$+-))
+import Data.Monoid  (Dual (..), Endo (..), (<>))
+
+import GHC.Exts (toList)
+
+import Network.Google.Auth               (AllowScopes, authorize)
+import Network.Google.Env                (Env (..))
+import Network.Google.Internal.Logger    (logDebug)
+import Network.Google.Internal.Multipart
+import Network.Google.Types
+import Network.HTTP.Conduit
+import Network.HTTP.Media                (RenderHeader (..))
+import Network.HTTP.Types
+
+import qualified Data.ByteString.Lazy        as LBS
+import qualified Data.Conduit.List           as Conduit
+import qualified Data.Text.Encoding          as Text
+import qualified Data.Text.Lazy              as LText
+import qualified Data.Text.Lazy.Builder      as Build
+import qualified Network.HTTP.Client.Conduit as Client
+
 -- FIXME: "mediaType" param also comes/calculated from the request body?
 --
 -- Resumable endpoints - Not supported to begin with, need to figure
@@ -53,7 +57,7 @@
   where
     Request       {..} = _cliRequest
     ServiceConfig {..} = _cliService
-    Client        {..} = requestClient x
+    GClient       {..} = requestClient x
         & clientService %~ appEndo (getDual _envOverride)
 
     go = liftResourceT $ do
@@ -103,7 +107,7 @@
     statusCheck rs
         | _cliCheck (responseStatus rs) = pure ()
         | otherwise                     = do
-                b <- LBS.fromChunks <$> (responseBody rs $$+- Conduit.consume)
+                b <- sinkLBS (responseBody rs)
                 throwM . toException . ServiceError $ ServiceError'
                     { _serviceId      = _svcId
                     , _serviceStatus  = responseStatus rs
diff --git a/src/Network/Google/Internal/Logger.hs b/src/Network/Google/Internal/Logger.hs
--- a/src/Network/Google/Internal/Logger.hs
+++ b/src/Network/Google/Internal/Logger.hs
@@ -47,7 +47,7 @@
 import qualified Data.Text.Lazy               as LText
 import qualified Data.Text.Lazy.Encoding      as LText
 import           Data.Word                    (Word16)
-import           Network.Google.Prelude       hiding (Header, Request)
+import           Network.Google.Prelude       hiding (Request)
 import           Network.HTTP.Conduit
 import           Network.HTTP.Types
 import           Numeric                      (showFFloat)
