diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Moritz Schulte (c) 2017
+Copyright Moritz Clasmeier (c) 2017, 2018
 
 All rights reserved.
 
diff --git a/async-refresh.cabal b/async-refresh.cabal
--- a/async-refresh.cabal
+++ b/async-refresh.cabal
@@ -1,5 +1,5 @@
 name:                async-refresh
-version:             0.2.0.2
+version:             0.3.0.0
 synopsis:            Package implementing core logic for refreshing of expiring data.
 description:         This package can be used for refreshing of expiring data according
                      to a user-provided action. Using callbacks, the user can decide
@@ -7,9 +7,9 @@
 homepage:            https://github.com/mtesseract/async-refresh
 license:             BSD3
 license-file:        LICENSE
-author:              Moritz Schulte
+author:              Moritz Clasmeier
 maintainer:          mtesseract@silverratio.net
-copyright:           (c) 2017 Moritz Schulte
+copyright:           (c) 2017, 2018 Moritz Clasmeier
 category:            Control
 build-type:          Simple
 extra-source-files:  README.md
@@ -39,7 +39,8 @@
                      , stm
                      , safe-exceptions
                      , formatting
-                     , monad-control
+                     , unliftio
+                     , unliftio-core
 
 test-suite async-refresh-test
   type:                exitcode-stdio-1.0
diff --git a/src/Control/Concurrent/Async/Refresh.hs b/src/Control/Concurrent/Async/Refresh.hs
--- a/src/Control/Concurrent/Async/Refresh.hs
+++ b/src/Control/Concurrent/Async/Refresh.hs
@@ -8,7 +8,7 @@
 {-|
 Module      : Control.Concurrent.Async.Refresh
 Description : This module exposes the API of the async-refresh package.
-Copyright   : (c) Moritz Schulte, 2017
+Copyright   : (c) Moritz Clasmeier, 2017-2018
 License     : BSD3
 Maintainer  : mtesseract@silverratio.net
 Stability   : experimental
@@ -34,11 +34,11 @@
   , asyncRefreshAsync
   ) where
 
-import           Control.Concurrent.Async.Lifted.Safe     (wait)
 import qualified Control.Concurrent.Async.Refresh.Lenses  as Lens
 import           Control.Concurrent.Async.Refresh.Prelude
 import           Control.Concurrent.Async.Refresh.Types
 import           Control.Concurrent.Async.Refresh.Util
+import           Control.Monad.IO.Unlift
 import           Lens.Micro
 
 -- | Given a refresh action, create a new configuration.
@@ -103,12 +103,10 @@
 
 -- | Start a new thread taking care of refreshing of data according to
 -- the given configuration.
-newAsyncRefresh :: ( MonadIO m
-                   , MonadBaseControl IO m
+newAsyncRefresh :: ( MonadUnliftIO m
                    , MonadCatch m
                    , MonadMask m
-                   , MonadLogger m
-                   , Forall (Pure m) )
+                   , MonadLogger m )
                 => AsyncRefreshConf m a
                 -> m AsyncRefresh
 newAsyncRefresh conf = AsyncRefresh <$> async (asyncRefreshCtrlThread conf)
@@ -116,12 +114,10 @@
 -- | Main function of the refresh control thread. Acts as a simple
 -- watchdog for the thread defined by 'asyncRefreshThread' doing the
 -- actual work.
-asyncRefreshCtrlThread :: ( MonadIO m
-                          , MonadBaseControl IO m
+asyncRefreshCtrlThread :: ( MonadUnliftIO m
                           , MonadCatch m
                           , MonadMask m
-                          , MonadLogger m
-                          , Forall (Pure m) )
+                          , MonadLogger m )
                        => AsyncRefreshConf m a
                        -> m ()
 asyncRefreshCtrlThread conf = do
@@ -129,11 +125,9 @@
   logErrorN "Unexpected termination of async refresh thread"
 
 -- | Main function for the thread implementing the refreshing logic.
-asyncRefreshThread :: ( MonadIO m
-                      , MonadBaseControl IO m
+asyncRefreshThread :: ( MonadUnliftIO m
                       , MonadCatch m
-                      , MonadLogger m
-                      , Forall (Pure m) )
+                      , MonadLogger m )
                    => AsyncRefreshConf m a -> m ()
 asyncRefreshThread conf = forever $
   tryAny (asyncRefreshDo conf) >>= \case
@@ -150,11 +144,9 @@
       threadDelay (conf ^. Lens.defaultInterval * 10^3)
 
 -- | This function does the actual refreshing work.
-asyncRefreshDo :: ( MonadIO m
-                  , MonadBaseControl IO m
+asyncRefreshDo :: ( MonadUnliftIO m
                   , MonadCatch m
-                  , MonadLogger m
-                  , Forall (Pure m) )
+                  , MonadLogger m )
                => AsyncRefreshConf m a -> m (RefreshResult a)
 asyncRefreshDo conf = do
   tryA <- tryAny (conf ^. Lens.action)
diff --git a/src/Control/Concurrent/Async/Refresh/Prelude.hs b/src/Control/Concurrent/Async/Refresh/Prelude.hs
--- a/src/Control/Concurrent/Async/Refresh/Prelude.hs
+++ b/src/Control/Concurrent/Async/Refresh/Prelude.hs
@@ -13,31 +13,28 @@
   , module Control.Exception.Safe
   , module Formatting
   , module Control.Monad.Logger
+  , module UnliftIO.Async
+  , threadDelay
   , Text
   , fromMaybe
-  , Async, Forall, Pure, withAsync, async
-  , threadDelay
   , forever, void
   , MonadIO
-  , MonadBaseControl
   , undefined
   , tshow
   ) where
 
-import qualified Control.Concurrent
-import           Control.Concurrent.Async.Lifted.Safe
 import           Control.Exception.Safe
 import           Control.Monad
 import           Control.Monad.IO.Class
 import           Control.Monad.Logger
-import           Control.Monad.Trans.Control
-import           Data.Maybe                           (fromMaybe)
-import           Data.Text                            (Text)
+import           Data.Maybe             (fromMaybe)
+import           Data.Text              (Text)
 import qualified Data.Text
 import           Formatting
-import           Prelude                              hiding (head, tail,
-                                                       undefined)
+import           Prelude                hiding (head, tail, undefined)
 import qualified Prelude
+import           UnliftIO.Async
+import           UnliftIO.Concurrent
 
 -- | Version of 'undefined' with a deprecated pragma.
 undefined :: a
@@ -48,7 +45,3 @@
 -- 'String'.
 tshow :: Show a => a -> Text
 tshow = Data.Text.pack . show
-
--- | Generalization of 'Control.Concurrent.threadDelay'.
-threadDelay :: MonadIO m => Int -> m ()
-threadDelay = liftIO . Control.Concurrent.threadDelay
