diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for rio-orphans
 
+## 0.1.2.0
+
+* Add an instance for `MonadLoggerIO` typeclass, from the `monad-logger` library
+
 ## 0.1.1.0
 
 * Add an instance for `MonadLogger` typeclass, from the `monad-logger` library
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,7 +2,8 @@
 
 Provides orphan instances for the `RIO` data type. Currently supports:
 
-* `MonadCatch` and `MonadMask` from `exceptions`
 * `MonadBase` from `transformers-base`
 * `MonadBaseControl` from `monad-control`
+* `MonadCatch` and `MonadMask` from `exceptions`
+* `MonadLogger` from `monad-logger`
 * `MonadResource` from `resourcet`
diff --git a/rio-orphans.cabal b/rio-orphans.cabal
--- a/rio-orphans.cabal
+++ b/rio-orphans.cabal
@@ -1,11 +1,13 @@
--- This file has been generated from package.yaml by hpack version 0.28.2.
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.33.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 77de0e86872a5e0ec50e213804741ac79e8f08b768bec53e0d190ae09cc14b40
+-- hash: 73b0abe6a63aaeca941c08d21e429b2221d75c0121c5d65d2dcd362f0beb6f2e
 
 name:           rio-orphans
-version:        0.1.1.0
+version:        0.1.2.0
 synopsis:       Orphan instances for the RIO type in the rio package
 description:    See README and Haddocks at <https://www.stackage.org/package/rio-orphans>
 category:       Control
@@ -16,10 +18,9 @@
 license:        MIT
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.10
 extra-source-files:
-    ChangeLog.md
     README.md
+    ChangeLog.md
 
 source-repository head
   type: git
@@ -33,7 +34,7 @@
   hs-source-dirs:
       src
   build-depends:
-      base >=4.9 && <10
+      base >=4.10 && <10
     , exceptions
     , fast-logger
     , monad-control
@@ -41,6 +42,7 @@
     , resourcet
     , rio
     , transformers-base
+    , unliftio-core
   default-language: Haskell2010
 
 test-suite rio-orphans-test
@@ -53,7 +55,7 @@
       test
   ghc-options: -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      base >=4.9 && <10
+      base >=4.10 && <10
     , exceptions
     , fast-logger
     , hspec
@@ -63,4 +65,5 @@
     , rio
     , rio-orphans
     , transformers-base
+    , unliftio-core
   default-language: Haskell2010
diff --git a/src/RIO/Orphans.hs b/src/RIO/Orphans.hs
--- a/src/RIO/Orphans.hs
+++ b/src/RIO/Orphans.hs
@@ -16,12 +16,13 @@
 import RIO
 import Control.Monad.Catch (MonadCatch, MonadMask)
 import Control.Monad.Base (MonadBase)
+import Control.Monad.IO.Unlift (askRunInIO)
 import Control.Monad.Trans.Resource.Internal (MonadResource (..), ReleaseMap, ResourceT (..))
 import Control.Monad.Trans.Resource (runResourceT)
 import Control.Monad.Trans.Control (MonadBaseControl (..))
 
 import qualified Control.Monad.Logger as LegacyLogger
-import Control.Monad.Logger (MonadLogger (..), LogStr)
+import Control.Monad.Logger (MonadLogger (..), MonadLoggerIO (..), LogStr)
 import System.Log.FastLogger (fromLogStr)
 import qualified GHC.Stack as GS
 
@@ -48,24 +49,39 @@
 -- | @since 0.1.1.0
 instance HasLogFunc env => MonadLogger (RIO env) where
   monadLoggerLog loc source level msg =
-      let ?callStack = GS.fromCallSiteList [("", GS.SrcLoc
-            { GS.srcLocPackage = LegacyLogger.loc_package loc
-            , GS.srcLocModule = LegacyLogger.loc_module loc
-            , GS.srcLocFile = LegacyLogger.loc_filename loc
-            , GS.srcLocStartLine = fst $ LegacyLogger.loc_start loc
-            , GS.srcLocStartCol = snd $ LegacyLogger.loc_start loc
-            , GS.srcLocEndLine = fst $ LegacyLogger.loc_end loc
-            , GS.srcLocEndCol = snd $ LegacyLogger.loc_end loc
-            })]
-       in logGeneric source rioLogLevel (display $ LegacyLogger.toLogStr msg)
-    where
-      rioLogLevel =
-        case level of
-          LegacyLogger.LevelDebug -> LevelDebug
-          LegacyLogger.LevelInfo  -> LevelInfo
-          LegacyLogger.LevelWarn  -> LevelWarn
-          LegacyLogger.LevelError  -> LevelError
-          LegacyLogger.LevelOther name -> LevelOther name
+      let ?callStack = rioCallStack loc
+       in logGeneric source (rioLogLevel level) (display $ LegacyLogger.toLogStr msg)
+
+-- | Do not let the generated function escape its RIO context. This may lead
+--   to log-related cleanup running /before/ the function is called.
+--
+--   @since 0.1.2.0
+instance HasLogFunc env => MonadLoggerIO (RIO env) where
+  askLoggerIO = do
+    runInIO <- askRunInIO
+    pure $ \loc source level str ->
+      let ?callStack = rioCallStack loc
+       in runInIO (logGeneric source (rioLogLevel level) (display str))
+
+rioLogLevel :: LegacyLogger.LogLevel -> LogLevel
+rioLogLevel level =
+  case level of
+    LegacyLogger.LevelDebug -> LevelDebug
+    LegacyLogger.LevelInfo  -> LevelInfo
+    LegacyLogger.LevelWarn  -> LevelWarn
+    LegacyLogger.LevelError  -> LevelError
+    LegacyLogger.LevelOther name -> LevelOther name
+
+rioCallStack :: LegacyLogger.Loc -> CallStack
+rioCallStack loc = GS.fromCallSiteList [("", GS.SrcLoc
+  { GS.srcLocPackage = LegacyLogger.loc_package loc
+  , GS.srcLocModule = LegacyLogger.loc_module loc
+  , GS.srcLocFile = LegacyLogger.loc_filename loc
+  , GS.srcLocStartLine = fst $ LegacyLogger.loc_start loc
+  , GS.srcLocStartCol = snd $ LegacyLogger.loc_start loc
+  , GS.srcLocEndLine = fst $ LegacyLogger.loc_end loc
+  , GS.srcLocEndCol = snd $ LegacyLogger.loc_end loc
+  })]
 
 -- | A collection of all of the registered resource cleanup actions.
 --
