diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
 All notable changes to this project will be documented in this file.
 This project adheres to [Package Versioning Policy](https://wiki.haskell.org/Package_versioning_policy).
 
+## [2.4.0.0] - 2018-05-03
+
+### Fixed
+- GHC 8.4 compatibility. isEmptyChan is not available in base 4.11 anymore.
+
 ## [2.3.0.5] - 2018-03-15
 
 ### Fixed
diff --git a/Database/MongoDB/Internal/Protocol.hs b/Database/MongoDB/Internal/Protocol.hs
--- a/Database/MongoDB/Internal/Protocol.hs
+++ b/Database/MongoDB/Internal/Protocol.hs
@@ -47,8 +47,9 @@
 import Data.Maybe (maybeToList)
 import GHC.Conc (ThreadStatus(..), threadStatus)
 import Control.Monad (forever)
-import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan, isEmptyChan)
+import Control.Monad.STM (atomically)
 import Control.Concurrent (ThreadId, killThread, forkFinally)
+import Control.Concurrent.STM.TChan (TChan, newTChan, readTChan, writeTChan, isEmptyTChan)
 
 import Control.Exception.Lifted (onException, throwIO, try)
 
@@ -87,7 +88,7 @@
 -- | Thread-safe and pipelined connection
 data Pipeline = Pipeline
     { vStream :: MVar Transport -- ^ Mutex on handle, so only one thread at a time can write to it
-    , responseQueue :: Chan (MVar (Either IOError Response)) -- ^ Queue of threads waiting for responses. Every time a response arrive we pop the next thread and give it the response.
+    , responseQueue :: TChan (MVar (Either IOError Response)) -- ^ Queue of threads waiting for responses. Every time a response arrive we pop the next thread and give it the response.
     , listenThread :: ThreadId
     , finished :: MVar ()
     , serverData :: ServerData
@@ -106,14 +107,14 @@
 newPipeline :: ServerData -> Transport -> IO Pipeline
 newPipeline serverData stream = do
     vStream <- newMVar stream
-    responseQueue <- newChan
+    responseQueue <- atomically newTChan
     finished <- newEmptyMVar
     let drainReplies = do
-          chanEmpty <- isEmptyChan responseQueue
+          chanEmpty <- atomically $ isEmptyTChan responseQueue
           if chanEmpty
             then return ()
             else do
-              var <- readChan responseQueue
+              var <- atomically $ readTChan responseQueue
               putMVar var $ Left $ mkIOError
                                         doesNotExistErrorType
                                         "Handle has been closed"
@@ -159,7 +160,7 @@
     stream <- readMVar vStream
     forever $ do
         e <- try $ readMessage stream
-        var <- readChan responseQueue
+        var <- atomically $ readTChan responseQueue
         putMVar var e
         case e of
             Left err -> Tr.close stream >> ioError err  -- close and stop looping
@@ -182,7 +183,7 @@
     doCall stream = do
         writeMessage stream message
         var <- newEmptyMVar
-        liftIO $ writeChan responseQueue var
+        liftIO $ atomically $ writeTChan responseQueue var
         return $ readMVar var >>= either throwIO return -- return promise
 
 -- * Pipe
diff --git a/mongoDB.cabal b/mongoDB.cabal
--- a/mongoDB.cabal
+++ b/mongoDB.cabal
@@ -1,5 +1,5 @@
 Name:           mongoDB
-Version:        2.3.0.5
+Version:        2.4.0.0
 Synopsis:       Driver (client) for MongoDB, a free, scalable, fast, document
                 DBMS
 Description:    This package lets you connect to MongoDB servers and
@@ -42,8 +42,9 @@
                     , monad-control >= 0.3.1
                     , lifted-base >= 0.1.0.3
                     , pureMD5
+                    , stm
                     , tagged
-                    , tls >= 1.2.0
+                    , tls >= 1.3.0
                     , time
                     , data-default-class -any
                     , transformers
@@ -51,7 +52,7 @@
                     , hashtables >= 1.1.2.0
                     , base16-bytestring >= 0.1.1.6
                     , base64-bytestring >= 1.0.0.1
-                    , nonce >= 1.0.2
+                    , nonce >= 1.0.5
 
   Exposed-modules:  Database.MongoDB
                     Database.MongoDB.Admin
@@ -105,7 +106,8 @@
                     , mtl >= 2
                     , cryptohash -any
                     , network -any
-                    , nonce
+                    , nonce >= 1.0.5
+                    , stm
                     , parsec -any
                     , random -any
                     , random-shuffle -any
