diff --git a/Control/Monad/Logger.hs b/Control/Monad/Logger.hs
--- a/Control/Monad/Logger.hs
+++ b/Control/Monad/Logger.hs
@@ -59,7 +59,16 @@
     ) where
 
 import Language.Haskell.TH.Syntax (Lift (lift), Q, Exp, Loc (..), qLocation)
+#if MIN_VERSION_fast_logger(0, 2, 0)
+import System.Log.FastLogger (LogStr, pushLogStr, ToLogStr (toLogStr), LoggerSet, newLoggerSet, defaultBufSize)
+import System.IO.Unsafe (unsafePerformIO)
+#define Handle LoggerSet
+import Data.Monoid (mempty, mappend)
+import qualified GHC.IO.FD as FD
+#else
 import System.Log.FastLogger (ToLogStr (toLogStr), LogStr (..))
+import System.IO (stdout, stderr, Handle)
+#endif
 
 import Data.Monoid (Monoid)
 
@@ -71,13 +80,8 @@
 import Control.Monad.Base (MonadBase (liftBase))
 import Control.Monad.Loops (untilM)
 import Control.Monad.Trans.Control (MonadBaseControl (..), MonadTransControl (..))
-import Data.Functor.Identity (Identity)
-import Control.Monad.ST (ST)
-import qualified Control.Monad.ST.Lazy as Lazy (ST)
 import qualified Control.Monad.Trans.Class as Trans
 
-import System.IO (stdout, stderr, Handle)
-
 import Control.Monad.IO.Class (MonadIO (liftIO))
 import Control.Monad.Trans.Resource (MonadResource (liftResourceT), MonadThrow (monadThrow))
 
@@ -97,10 +101,9 @@
 import qualified Control.Monad.Trans.State.Strict  as Strict ( StateT )
 import qualified Control.Monad.Trans.Writer.Strict as Strict ( WriterT )
 
-import Data.Text (Text, pack, unpack, empty)
+import Data.Text (Text, pack, unpack)
 import qualified Data.Text as T
 import qualified Data.ByteString.Char8 as S8
-import Data.Text.Encoding (encodeUtf8)
 
 import Control.Monad.Cont.Class   ( MonadCont (..) )
 import Control.Monad.Error.Class  ( MonadError (..) )
@@ -315,6 +318,22 @@
               -> LogStr
               -> IO ()
 defaultOutput h loc src level msg =
+#if MIN_VERSION_fast_logger(0, 2, 0)
+    pushLogStr h $
+    "[" `mappend`
+    (case level of
+        LevelOther t -> toLogStr t
+        _ -> toLogStr $ S8.pack $ drop 5 $ show level) `mappend`
+    (if T.null src
+        then mempty
+        else "#" `mappend` toLogStr src) `mappend`
+    "] " `mappend`
+    msg `mappend`
+    " @(" `mappend`
+    toLogStr (S8.pack fileLocStr) `mappend`
+    ")\n"
+  where
+#else
     S8.hPutStrLn h $ S8.concat bs
   where
     bs =
@@ -333,6 +352,7 @@
         , encodeUtf8 $ pack fileLocStr
         , S8.pack ")\n"
         ]
+#endif
 
     -- taken from file-location package
     -- turn the TH Loc loaction information into a human readable string
@@ -342,6 +362,14 @@
       where
         line = show . fst . loc_start
         char = show . snd . loc_start
+
+#if MIN_VERSION_fast_logger(0, 2, 0)
+stdout, stderr :: LoggerSet
+stdout = unsafePerformIO $ newLoggerSet defaultBufSize FD.stdout
+{-# NOINLINE stdout #-}
+stderr = unsafePerformIO $ newLoggerSet defaultBufSize FD.stderr
+{-# NOINLINE stderr #-}
+#endif
 
 -- | Run a block using a @MonadLogger@ instance which prints to stderr.
 --
diff --git a/monad-logger.cabal b/monad-logger.cabal
--- a/monad-logger.cabal
+++ b/monad-logger.cabal
@@ -1,5 +1,5 @@
 name:                monad-logger
-version:             0.3.2.0
+version:             0.3.3.0
 synopsis:            A class of monads which can log messages.
 description:         This package uses template-haskell for determining source code locations of messages.
 homepage:            https://github.com/kazu-yamamoto/logger
@@ -23,7 +23,7 @@
                      , lifted-base
                      , resourcet          >= 0.4       && < 0.5
                      , conduit            >= 1.0       && < 1.1
-                     , fast-logger        >= 0.2       && < 0.4
+                     , fast-logger        >= 0.2       && < 2.1
                      , transformers-base
                      , monad-control
                      , monad-loops
