diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 0.2.1.0
+
+* Add `UnliftIO.STM`
+* Add a number of functions to `UnliftIO.IO`
+
 ## 0.2.0.0
 
 * Remove `monad-logger` instances (moved into `monad-logger` itself in
diff --git a/src/UnliftIO.hs b/src/UnliftIO.hs
--- a/src/UnliftIO.hs
+++ b/src/UnliftIO.hs
@@ -6,6 +6,7 @@
   , module UnliftIO.IO
   , module UnliftIO.IORef
   , module UnliftIO.MVar
+  , module UnliftIO.STM
   , module UnliftIO.Temporary
   , module UnliftIO.Timeout
   ) where
@@ -17,5 +18,6 @@
 import UnliftIO.IO
 import UnliftIO.IORef
 import UnliftIO.MVar
+import UnliftIO.STM
 import UnliftIO.Temporary
 import UnliftIO.Timeout
diff --git a/src/UnliftIO/IO.hs b/src/UnliftIO/IO.hs
--- a/src/UnliftIO/IO.hs
+++ b/src/UnliftIO/IO.hs
@@ -4,8 +4,32 @@
 module UnliftIO.IO
   ( IOMode (..)
   , Handle
+  , IO.stdin
+  , IO.stdout
+  , IO.stderr
   , withFile
   , withBinaryFile
+  , hClose
+  , hFlush
+  , hFileSize
+  , hSetFileSize
+  , hIsEOF
+  , IO.BufferMode (..)
+  , hSetBuffering
+  , hGetBuffering
+  , hSeek
+  , IO.SeekMode
+  , hTell
+  , hIsOpen
+  , hIsClosed
+  , hIsReadable
+  , hIsWritable
+  , hIsSeekable
+  , hIsTerminalDevice
+  , hSetEcho
+  , hGetEcho
+  , hWaitForInput
+  , hReady
   ) where
 
 import qualified System.IO as IO
@@ -23,3 +47,117 @@
 -- @since 0.1.0.0
 withBinaryFile :: MonadUnliftIO m => FilePath -> IOMode -> (Handle -> m a) -> m a
 withBinaryFile fp mode inner = withRunInIO $ \run -> IO.withBinaryFile fp mode $ run . inner
+
+-- | Lifted version of 'IO.hClose'
+--
+-- @since 0.2.1.0
+hClose :: MonadIO m => Handle -> m ()
+hClose = liftIO . IO.hClose
+
+-- | Lifted version of 'IO.hFlush'
+--
+-- @since 0.2.1.0
+hFlush :: MonadIO m => Handle -> m ()
+hFlush = liftIO . IO.hFlush
+
+-- | Lifted version of 'IO.hFileSize'
+--
+-- @since 0.2.1.0
+hFileSize :: MonadIO m => Handle -> m Integer
+hFileSize = liftIO . IO.hFileSize
+
+-- | Lifted version of 'IO.hSetFileSize'
+--
+-- @since 0.2.1.0
+hSetFileSize :: MonadIO m => Handle -> Integer -> m ()
+hSetFileSize h = liftIO . IO.hSetFileSize h
+
+-- | Lifted version of 'IO.hIsEOF'
+--
+-- @since 0.2.1.0
+hIsEOF :: MonadIO m => Handle -> m Bool
+hIsEOF = liftIO . IO.hIsEOF
+
+-- | Lifted version of 'IO.hSetBuffering'
+--
+-- @since 0.2.1.0
+hSetBuffering :: MonadIO m => Handle -> IO.BufferMode -> m ()
+hSetBuffering h = liftIO . IO.hSetBuffering h
+
+-- | Lifted version of 'IO.hGetBuffering'
+--
+-- @since 0.2.1.0
+hGetBuffering :: MonadIO m => Handle -> m IO.BufferMode
+hGetBuffering = liftIO . IO.hGetBuffering
+
+-- | Lifted version of 'IO.hSeek'
+--
+-- @since 0.2.1.0
+hSeek :: MonadIO m => Handle -> IO.SeekMode -> Integer -> m ()
+hSeek h s = liftIO . IO.hSeek h s
+
+-- | Lifted version of 'IO.hTell'
+--
+-- @since 0.2.1.0
+hTell :: MonadIO m => Handle -> m Integer
+hTell = liftIO . IO.hTell
+
+-- | Lifted version of 'IO.hIsOpen'
+--
+-- @since 0.2.1.0
+hIsOpen :: MonadIO m => Handle -> m Bool
+hIsOpen = liftIO . IO.hIsOpen
+
+-- | Lifted version of 'IO.hIsClosed'
+--
+-- @since 0.2.1.0
+hIsClosed :: MonadIO m => Handle -> m Bool
+hIsClosed = liftIO . IO.hIsClosed
+
+-- | Lifted version of 'IO.hIsReadable'
+--
+-- @since 0.2.1.0
+hIsReadable :: MonadIO m => Handle -> m Bool
+hIsReadable = liftIO . IO.hIsReadable
+
+-- | Lifted version of 'IO.hIsWritable'
+--
+-- @since 0.2.1.0
+hIsWritable :: MonadIO m => Handle -> m Bool
+hIsWritable = liftIO . IO.hIsWritable
+
+-- | Lifted version of 'IO.hIsSeekable'
+--
+-- @since 0.2.1.0
+hIsSeekable :: MonadIO m => Handle -> m Bool
+hIsSeekable = liftIO . IO.hIsSeekable
+
+-- | Lifted version of 'IO.hIsTerminalDevice'
+--
+-- @since 0.2.1.0
+hIsTerminalDevice :: MonadIO m => Handle -> m Bool
+hIsTerminalDevice = liftIO . IO.hIsTerminalDevice
+
+-- | Lifted version of 'IO.hSetEcho'
+--
+-- @since 0.2.1.0
+hSetEcho :: MonadIO m => Handle -> Bool -> m ()
+hSetEcho h = liftIO . IO.hSetEcho h
+
+-- | Lifted version of 'IO.hGetEcho'
+--
+-- @since 0.2.1.0
+hGetEcho :: MonadIO m => Handle -> m Bool
+hGetEcho = liftIO . IO.hGetEcho
+
+-- | Lifted version of 'IO.hWaitForInput'
+--
+-- @since 0.2.1.0
+hWaitForInput :: MonadIO m => Handle -> Int -> m Bool
+hWaitForInput h = liftIO . IO.hWaitForInput h
+
+-- | Lifted version of 'IO.hReady'
+--
+-- @since 0.2.1.0
+hReady :: MonadIO m => Handle -> m Bool
+hReady = liftIO . IO.hReady
diff --git a/src/UnliftIO/STM.hs b/src/UnliftIO/STM.hs
new file mode 100644
--- /dev/null
+++ b/src/UnliftIO/STM.hs
@@ -0,0 +1,168 @@
+-- | Lifted version of "Control.Concurrent.STM"
+--
+-- @since 0.2.1.0
+module UnliftIO.STM
+  ( -- * Core
+    STM.STM
+  , atomically
+  , retrySTM
+  , checkSTM
+
+    -- * TVar
+  , STM.TVar
+  , newTVarIO
+  , readTVarIO
+  , STM.newTVar
+  , STM.readTVar
+  , STM.writeTVar
+  , STM.modifyTVar
+  , STM.modifyTVar'
+  , STM.swapTVar
+  , registerDelay
+  , mkWeakTVar
+
+    -- * TMVar
+  , STM.TMVar
+  , STM.newTMVar
+  , STM.newEmptyTMVar
+  , newTMVarIO
+  , newEmptyTMVarIO
+  , STM.takeTMVar
+  , STM.putTMVar
+  , STM.readTMVar
+  , STM.tryReadTMVar
+  , STM.swapTMVar
+  , STM.tryTakeTMVar
+  , STM.isEmptyTMVar
+  , mkWeakTMVar
+
+    -- * TChan
+  , STM.TChan
+  , STM.newTChan
+  , newTChanIO
+  , STM.newBroadcastTChan
+  , newBroadcastTChanIO
+  , STM.dupTChan
+  , STM.cloneTChan
+  , STM.readTChan
+  , STM.tryReadTChan
+  , STM.peekTChan
+  , STM.tryPeekTChan
+  , STM.writeTChan
+  , STM.unGetTChan
+  , STM.isEmptyTChan
+
+    -- * TQueue
+  , STM.TQueue
+  , STM.newTQueue
+  , newTQueueIO
+  , STM.readTQueue
+  , STM.tryReadTQueue
+  , STM.peekTQueue
+  , STM.tryPeekTQueue
+  , STM.writeTQueue
+  , STM.unGetTQueue
+  , STM.isEmptyTQueue
+
+    -- * TBQueue
+  , STM.TBQueue
+  , STM.newTBQueue
+  , newTBQueueIO
+  , STM.readTBQueue
+  , STM.tryReadTBQueue
+  , STM.peekTBQueue
+  , STM.tryPeekTBQueue
+  , STM.writeTBQueue
+  , STM.unGetTBQueue
+  , STM.isEmptyTBQueue
+  , STM.isFullTBQueue
+  ) where
+
+import Control.Concurrent.STM (STM, TVar, TMVar, TChan, TQueue, TBQueue)
+import qualified Control.Concurrent.STM as STM
+import Control.Monad.IO.Unlift
+import System.Mem.Weak (Weak)
+
+-- | Lifted version of 'STM.atomically'
+--
+-- @since 0.2.1.0
+atomically :: MonadIO m => STM a -> m a
+atomically = liftIO . STM.atomically
+
+-- | Renamed 'STM.retry' for unqualified export
+--
+-- @since 0.2.1.0
+retrySTM :: STM a
+retrySTM = STM.retry
+
+-- | Renamed 'STM.check' for unqualified export
+--
+-- @since 0.2.1.0
+checkSTM :: Bool -> STM ()
+checkSTM = STM.check
+
+-- | Lifted version of 'STM.newTVarIO'
+--
+-- @since 0.2.1.0
+newTVarIO :: MonadIO m => a -> m (TVar a)
+newTVarIO = liftIO . STM.newTVarIO
+
+-- | Lifted version of 'STM.readTVarIO'
+--
+-- @since 0.2.1.0
+readTVarIO :: MonadIO m => TVar a -> m a
+readTVarIO = liftIO . STM.readTVarIO
+
+-- | Lifted version of 'STM.registerDelay'
+--
+-- @since 0.2.1.0
+registerDelay :: MonadIO m => Int -> m (TVar Bool)
+registerDelay = liftIO . STM.registerDelay
+
+-- | Lifted version of 'STM.mkWeakTVar'
+--
+-- @since 0.2.1.0
+mkWeakTVar :: MonadUnliftIO m => TVar a -> m () -> m (Weak (TVar a))
+mkWeakTVar var final = withRunInIO $ \run -> STM.mkWeakTVar var (run final)
+
+-- | Lifted version of 'STM.newTMVarIO'
+--
+-- @since 0.2.1.0
+newTMVarIO :: MonadIO m => a -> m (TMVar a)
+newTMVarIO = liftIO . STM.newTMVarIO
+
+-- | Lifted version of 'STM.newEmptyTMVarIO'
+--
+-- @since 0.2.1.0
+newEmptyTMVarIO :: MonadIO m => m (TMVar a)
+newEmptyTMVarIO = liftIO STM.newEmptyTMVarIO
+
+-- | Lifted version of 'STM.mkWeakTMVar'
+--
+-- @since 0.2.1.0
+mkWeakTMVar :: MonadUnliftIO m => TMVar a -> m () -> m (Weak (TMVar a))
+mkWeakTMVar var final = withRunInIO $ \run -> STM.mkWeakTMVar var (run final)
+
+-- | Lifted version of 'STM.newTChanIO'
+--
+-- @since 0.2.1.0
+newTChanIO :: MonadIO m => m (TChan a)
+newTChanIO = liftIO STM.newTChanIO
+
+-- | Lifted version of 'STM.newBroadcastTChanIO'
+--
+-- @since 0.2.1.0
+newBroadcastTChanIO :: MonadIO m => m (TChan a)
+newBroadcastTChanIO = liftIO STM.newBroadcastTChanIO
+
+-- | Lifted version of 'STM.newTQueueIO'
+--
+-- @since 0.2.1.0
+newTQueueIO :: MonadIO m => m (TQueue a)
+newTQueueIO = liftIO STM.newTQueueIO
+
+-- | Lifted version of 'STM.newTBQueueIO'
+--
+-- @since 0.2.1.0
+newTBQueueIO :: MonadIO m => Int -> m (TBQueue a)
+newTBQueueIO = liftIO . STM.newTBQueueIO
diff --git a/unliftio.cabal b/unliftio.cabal
--- a/unliftio.cabal
+++ b/unliftio.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 6ca5582046f74fd2e94f44a1652944e0bceb39a5a715a49b0615c8eafd8f573e
+-- hash: 3d617105f39ba722d85acf902a79e88a36deefc409b7655ae9d69526e65b648f
 
 name:           unliftio
-version:        0.2.0.0
+version:        0.2.1.0
 synopsis:       The MonadUnliftIO typeclass for unlifting monads to IO (batteries included)
 description:    Please see the README.md file for details.
 category:       Control
@@ -31,6 +31,7 @@
     , deepseq
     , directory
     , filepath
+    , stm >=2.4.3
     , transformers
     , unliftio-core
   if !os(Windows)
@@ -45,6 +46,7 @@
       UnliftIO.IO
       UnliftIO.IORef
       UnliftIO.MVar
+      UnliftIO.STM
       UnliftIO.Temporary
       UnliftIO.Timeout
   other-modules:
