diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,4 +8,5 @@
 
 ## Unreleased
 
-## 0.1.0.0 - YYYY-MM-DD
+## 0.5.3.0
+- Add: MockT now implements MonadUnliftIO
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -17,6 +17,7 @@
 <details>
 <summary>Update History</summary>
 
+- **0.5.3.0**: MockT now implements MonadUnliftIO
 - **0.5.0**: Stub functions of type `IO a` can now return different values each time they are applied
 - **0.4.0**: Can make partial mocks of type classes.
 - **0.3.0**: Can make mocks of type classes.
diff --git a/mockcat.cabal b/mockcat.cabal
--- a/mockcat.cabal
+++ b/mockcat.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           mockcat
-version:        0.5.2.0
+version:        0.5.3.0
 synopsis:       Mock library for test in Haskell.
 description:    mockcat is a flexible and powerful mock library.
                 .
@@ -55,9 +55,11 @@
   build-depends:
       base >=4.7 && <5
     , mtl >=2.3.1 && <2.4
-    , template-haskell >=2.18 && <2.23
+    , template-haskell >=2.18 && <2.24
     , text >=2.0 && <2.2
     , transformers >=0.5.6 && <0.7
+    , unliftio >=0.2.25.0 && <0.2.26
+    , unliftio-core >=0.2.1.0 && <0.2.2
   default-language: Haskell2010
 
 test-suite mockcat-test
@@ -80,11 +82,14 @@
       test
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -fprint-potential-instances -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      base >=4.7 && <5
-    , hspec
+      async >=2.2.4 && <2.3
+    , base >=4.7 && <5
+    , hspec ==2.11.*
     , mockcat
     , mtl >=2.3.1 && <2.4
-    , template-haskell >=2.18 && <2.23
+    , template-haskell >=2.18 && <2.24
     , text >=2.0 && <2.2
     , transformers >=0.5.6 && <0.7
+    , unliftio >=0.2.25.0 && <0.2.26
+    , unliftio-core >=0.2.1.0 && <0.2.2
   default-language: Haskell2010
diff --git a/src/Test/MockCat/MockT.hs b/src/Test/MockCat/MockT.hs
--- a/src/Test/MockCat/MockT.hs
+++ b/src/Test/MockCat/MockT.hs
@@ -6,14 +6,22 @@
 {-# OPTIONS_GHC -Wno-name-shadowing #-}
 module Test.MockCat.MockT (MockT(..), Definition(..), runMockT, applyTimesIs, neverApply) where
 import Control.Monad.State
-    ( StateT(..), MonadIO(..), MonadTrans(..), modify, execStateT )
+    ( StateT(..), MonadIO(..), MonadTrans(..), modify, execStateT, runStateT )
 import GHC.TypeLits (KnownSymbol)
 import Data.Data (Proxy)
 import Test.MockCat.Mock (Mock, shouldApplyTimesToAnything)
 import Data.Foldable (for_)
+import UnliftIO (MonadUnliftIO(..))
+import Data.Functor ((<&>))
 
 newtype MockT m a = MockT { st :: StateT [Definition] m a }
   deriving (Functor, Applicative, Monad, MonadTrans, MonadIO)
+
+instance MonadUnliftIO m => MonadUnliftIO (MockT m) where
+  withRunInIO inner = MockT $ StateT $ \s -> do
+    a <- withRunInIO $ \runInIO ->
+      inner (\(MockT m) -> runInIO (runStateT m s) <&> fst)
+    pure (a, s)
 
 data Definition = forall f p sym. KnownSymbol sym => Definition {
   symbol :: Proxy sym,
diff --git a/test/Test/MockCat/TypeClassTHSpec.hs b/test/Test/MockCat/TypeClassTHSpec.hs
--- a/test/Test/MockCat/TypeClassTHSpec.hs
+++ b/test/Test/MockCat/TypeClassTHSpec.hs
@@ -21,6 +21,8 @@
 import Control.Monad.State
 import Control.Monad.Reader (MonadReader, ask)
 import Control.Monad (unless)
+import Control.Monad.IO.Unlift (withRunInIO, MonadUnliftIO)
+import Control.Concurrent.Async (async, wait)
 
 class Monad m => FileOperation m where
   writeFile :: FilePath -> Text -> m ()
@@ -139,6 +141,15 @@
 
 makeMockWithOptions [t|ExplicitlyReturnMonadicValuesTest|] options { implicitMonadicReturn = False }
 
+class MonadUnliftIO m => MonadAsync m where
+  mapConcurrently :: Traversable t => (a -> m b) -> t a -> m (t b)
+
+instance (MonadUnliftIO m) => MonadAsync (MockT m) where
+  mapConcurrently = traverse
+
+processFiles :: MonadAsync m => FileOperation m => [FilePath] -> m [Text]
+processFiles = mapConcurrently readFile
+
 spec :: Spec
 spec = do
   it "Read, and output files" do
@@ -215,3 +226,38 @@
       echoProgram "s"
 
     result `shouldBe` ()
+
+  it "MonadUnliftIO instance works correctly" do
+    result <- runMockT do
+      _readFile ("test.txt" |> pack "content")
+
+      content <- withRunInIO $ \runInIO -> do
+        asyncAction <- async $ runInIO (readFile "test.txt")
+        wait asyncAction
+
+      liftIO $ content `shouldBe` pack "content"
+      pure content
+
+    result `shouldBe` pack "content"
+
+  it "MonadUnliftIO basic functionality" do
+    result <- runMockT do
+      _readFile ("test.txt" |> pack "test content")
+      
+      content <- withRunInIO $ \runInIO -> do
+        runInIO (readFile "test.txt")
+      
+      liftIO $ content `shouldBe` pack "test content"
+      pure content
+
+    result `shouldBe` pack "test content"
+  
+  it "MonadAsync type class can be instantiated for MockT" do
+    result <- runMockT do
+      _readFile $ do
+        onCase $ "file1.txt" |> pack "content1"
+        onCase $ "file2.txt" |> pack "content2"
+
+      processFiles ["file1.txt", "file2.txt"]
+    result `shouldBe` [pack "content1", pack "content2"]
+
