diff --git a/Data/Text/IO.hs b/Data/Text/IO.hs
new file mode 100644
--- /dev/null
+++ b/Data/Text/IO.hs
@@ -0,0 +1,28 @@
+module Data.Text.IO where
+
+import qualified Data.ByteString as BS
+import Data.Text as T
+import Data.Text.Private
+import System.IO (Handle, stdin, stdout)
+
+put, putLn :: Text -> IO ()
+put = hPut stdout
+putLn = hPutLn stdout
+
+getContents :: IO Text
+getContents = hGetContents stdin
+
+hGet :: Handle -> Int -> IO Text
+hGet h n = Text <$> BS.hGet h n
+
+hGetContents :: Handle -> IO Text
+hGetContents h = Text <$> BS.hGetContents h
+
+hPut, hPutLn :: Handle -> Text -> IO ()
+hPut h = BS.hPut h . unText
+hPutLn h t
+  | T.length t < 0x400 = hPut h (t `snoc` '\n')
+  | otherwise          = hPut h t *> hPut h "\n"
+
+hPutNonBlocking :: Handle -> Text -> IO Text
+hPutNonBlocking h = fmap Text . BS.hPutNonBlocking h . unText
diff --git a/Data/Text/Lazy/IO.hs b/Data/Text/Lazy/IO.hs
new file mode 100644
--- /dev/null
+++ b/Data/Text/Lazy/IO.hs
@@ -0,0 +1,28 @@
+module Data.Text.Lazy.IO where
+
+import qualified Data.ByteString.Lazy as BS
+import Data.Text.Lazy as T
+import Data.Text.Lazy.Private
+import System.IO (Handle, stdin, stdout)
+
+put, putLn :: Text -> IO ()
+put = hPut stdout
+putLn = hPutLn stdout
+
+getContents :: IO Text
+getContents = hGetContents stdin
+
+hGet :: Handle -> Int -> IO Text
+hGet h n = Text <$> BS.hGet h n
+
+hGetContents :: Handle -> IO Text
+hGetContents h = Text <$> BS.hGetContents h
+
+hPut, hPutLn :: Handle -> Text -> IO ()
+hPut h = BS.hPut h . unText
+hPutLn h t
+  | T.length t < 0x400 = hPut h (t `snoc` '\n')
+  | otherwise          = hPut h t *> hPut h "\n"
+
+hPutNonBlocking :: Handle -> Text -> IO Text
+hPutNonBlocking h = fmap Text . BS.hPutNonBlocking h . unText
diff --git a/txt.cabal b/txt.cabal
--- a/txt.cabal
+++ b/txt.cabal
@@ -1,5 +1,5 @@
 name:                txt
-version:             0.0.2.1
+version:             0.0.3.0
 synopsis:            Text
 -- description:
 license:             BSD3
@@ -15,7 +15,9 @@
 library
   hs-source-dirs:      .
   exposed-modules:     Data.Text
+                     , Data.Text.IO
                      , Data.Text.Lazy
+                     , Data.Text.Lazy.IO
   other-modules:       Data.Text.Lazy.Private
                      , Data.Text.Private
   build-depends:       base >= 4.7 && < 5
