diff --git a/log.cabal b/log.cabal
--- a/log.cabal
+++ b/log.cabal
@@ -1,5 +1,5 @@
 name:                log
-version:             0.5.7
+version:             0.6
 synopsis:            Structured logging solution with multiple backends
 
 description:         A library that provides a way to record structured
diff --git a/src/Log/Backend/ElasticSearch.hs b/src/Log/Backend/ElasticSearch.hs
--- a/src/Log/Backend/ElasticSearch.hs
+++ b/src/Log/Backend/ElasticSearch.hs
@@ -24,6 +24,7 @@
 import Data.Word
 import Database.Bloodhound hiding (Status)
 import Log
+import Log.Internal.Logger
 import Network.HTTP.Client
 import Prelude
 import TextShow
diff --git a/src/Log/Backend/PostgreSQL.hs b/src/Log/Backend/PostgreSQL.hs
--- a/src/Log/Backend/PostgreSQL.hs
+++ b/src/Log/Backend/PostgreSQL.hs
@@ -22,6 +22,7 @@
 
 import Log.Data
 import Log.Logger
+import Log.Internal.Logger
 
 newtype InvalidEncodingRecoveryAttempt = Attempt Int
   deriving Enum
diff --git a/src/Log/Backend/StandardOutput/Bulk.hs b/src/Log/Backend/StandardOutput/Bulk.hs
--- a/src/Log/Backend/StandardOutput/Bulk.hs
+++ b/src/Log/Backend/StandardOutput/Bulk.hs
@@ -9,6 +9,7 @@
 
 import Log.Data
 import Log.Logger
+import Log.Internal.Logger
 
 -- | Create a 'bulkStdoutLogger' for the duration of the given action,
 -- and shut it down afterwards, making sure that all buffered messages
diff --git a/src/Log/Internal/Logger.hs b/src/Log/Internal/Logger.hs
--- a/src/Log/Internal/Logger.hs
+++ b/src/Log/Internal/Logger.hs
@@ -5,9 +5,11 @@
   , execLogger
   , waitForLogger
   , shutdownLogger
+  , withLogger
   ) where
 
 import Data.Semigroup
+import Control.Exception
 import Prelude
 
 import Log.Data
@@ -41,6 +43,13 @@
 -- will result in an exception.
 shutdownLogger :: Logger -> IO ()
 shutdownLogger Logger{..} = loggerShutdown
+
+-- | 'bracket'-like execution of an 'IO' action, verifying all messages
+-- are properly logged. See 'mkBulkLogger'.
+withLogger :: Logger -> (Logger -> IO r) -> IO r
+withLogger logger act = act logger `finally` cleanup
+  where
+    cleanup = waitForLogger logger >> shutdownLogger logger
 
 instance Semigroup Logger where
   l1 <> l2 = Logger {
diff --git a/src/Log/Logger.hs b/src/Log/Logger.hs
--- a/src/Log/Logger.hs
+++ b/src/Log/Logger.hs
@@ -3,7 +3,6 @@
     Logger
   , mkLogger
   , mkBulkLogger
-  , withLogger
   , execLogger
   , waitForLogger
   , shutdownLogger
@@ -78,13 +77,6 @@
 mkBulkLogger :: T.Text -> ([LogMessage] -> IO ()) -> IO () -> IO Logger
 mkBulkLogger = mkLoggerImpl
   newSQueueIO isEmptySQueue readSQueue writeSQueue (threadDelay 1000000)
-
--- | 'bracket' like execution of an 'IO' action, verifying all messages
--- are properly logged. See 'mkBulkLogger'.
-withLogger :: Logger -> (Logger -> IO r) -> IO r
-withLogger logger act = act logger `finally` cleanup
-  where
-    cleanup = waitForLogger logger >> shutdownLogger logger
 
 ----------------------------------------
 
