diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,11 @@
+# Version 0.6.3
+
+* Bump `network-simple`, `transformers` and `pipes-safe` upper bounds.
+
+* Remove `Base m ~ IO` constraints from `Pipes.Network.TCP.Safe`, as
+  not all of them were removed in 0.6.1.
+
+
 # Version 0.6.2
 
 * Dependency bumps (upper bounds).
diff --git a/pipes-network.cabal b/pipes-network.cabal
--- a/pipes-network.cabal
+++ b/pipes-network.cabal
@@ -1,5 +1,5 @@
 name:               pipes-network
-version:            0.6.2
+version:            0.6.3
 license:            BSD3
 license-file:       LICENSE
 copyright:          Copyright (c) Renzo Carbonara 2012-2014, Paolo Capriotti 2012-2012.
@@ -41,10 +41,10 @@
         base           (==4.*),
         bytestring     (>=0.9.2.1),
         network,
-        network-simple (>=0.3 && <0.4),
+        network-simple (>=0.3 && <0.5),
         pipes          (>=4.0 && <4.2),
-        pipes-safe     (>=2.0.1 && <2.1),
-        transformers   (>=0.2 && <0.4)
+        pipes-safe     (>=2.1 && <2.3),
+        transformers   (>=0.2 && <0.5)
     exposed-modules:
         Pipes.Network.TCP
         Pipes.Network.TCP.Safe
diff --git a/src/Pipes/Network/TCP.hs b/src/Pipes/Network/TCP.hs
--- a/src/Pipes/Network/TCP.hs
+++ b/src/Pipes/Network/TCP.hs
@@ -83,7 +83,7 @@
 -- | Like 'fromSocket', except with the first 'Int' argument you can specify
 -- the maximum time that each interaction with the remote end can take. If such
 -- time elapses before the interaction finishes, then an 'IOError' exception is
--- thrown. The time is specified in microseconds (10e6).
+-- thrown. The time is specified in microseconds (1 second = 1e6 microseconds).
 fromSocketTimeout
   :: MonadIO m
   => Int -> Socket -> Int -> Producer' B.ByteString m ()
@@ -121,7 +121,7 @@
 -- | Like 'fromSocketN', except with the first 'Int' argument you can specify
 -- the maximum time that each interaction with the remote end can take. If such
 -- time elapses before the interaction finishes, then an 'IOError' exception is
--- thrown. The time is specified in microseconds (10e6).
+-- thrown. The time is specified in microseconds (1 second = 1e6 microseconds).
 fromSocketTimeoutN
   :: MonadIO m
   => Int -> Socket -> Int -> Server' Int B.ByteString m ()
@@ -158,7 +158,7 @@
 -- | Like 'toSocket', except with the first 'Int' argument you can specify
 -- the maximum time that each interaction with the remote end can take. If such
 -- time elapses before the interaction finishes, then an 'IOError' exception is
--- thrown. The time is specified in microseconds (10e6).
+-- thrown. The time is specified in microseconds (1 second = 1e6 microseconds).
 toSocketTimeout
   :: MonadIO m
   => Int -> Socket -> Consumer' B.ByteString m r
diff --git a/src/Pipes/Network/TCP/Safe.hs b/src/Pipes/Network/TCP/Safe.hs
--- a/src/Pipes/Network/TCP/Safe.hs
+++ b/src/Pipes/Network/TCP/Safe.hs
@@ -61,7 +61,7 @@
 -- | Like 'Network.Simple.TCP.connect' from "Network.Simple.TCP", but compatible
 -- with 'Ps.MonadSafe'.
 connect
-  :: (Ps.MonadSafe m)
+  :: Ps.MonadSafe m
   => HostName -> ServiceName -> ((Socket, SockAddr) -> m r) -> m r
 connect host port = Ps.bracket (connectSock host port)
                                (liftIO . NS.sClose . fst)
@@ -69,7 +69,7 @@
 -- | Like 'Network.Simple.TCP.serve' from "Network.Simple.TCP", but compatible
 -- with 'Ps.MonadSafe'.
 serve
-  :: (Ps.MonadSafe m)
+  :: Ps.MonadSafe m
   => HostPreference -> ServiceName -> ((Socket, SockAddr) -> IO ()) -> m r
 serve hp port k = do
    listen hp port $ \(lsock,_) -> do
@@ -78,7 +78,7 @@
 -- | Like 'Network.Simple.TCP.listen' from "Network.Simple.TCP", but compatible
 -- with 'Ps.MonadSafe'.
 listen
-  :: (Ps.MonadSafe m)
+  :: Ps.MonadSafe m
   => HostPreference -> ServiceName -> ((Socket, SockAddr) -> m r) -> m r
 listen hp port = Ps.bracket listen' (liftIO . NS.sClose . fst)
   where
@@ -90,7 +90,7 @@
 -- | Like 'Network.Simple.TCP.accept' from "Network.Simple.TCP", but compatible
 -- with 'Ps.MonadSafe'.
 accept
-  :: (Ps.MonadSafe m)
+  :: Ps.MonadSafe m
   => Socket -> ((Socket, SockAddr) -> m r) -> m r
 accept lsock k = do
     conn@(csock,_) <- liftIO (NS.accept lsock)
@@ -120,7 +120,7 @@
 --
 -- >>> runSafeT . runEffect $ fromConnect 4096 "127.0.0.1" "9000" >-> P.print
 fromConnect
-  :: (Ps.MonadSafe m, Ps.Base m ~ IO)
+  :: Ps.MonadSafe m
   => Int             -- ^Maximum number of bytes to receive and send
                      -- dowstream at once. Any positive value is fine, the
                      -- optimal value depends on how you deal with the
@@ -143,7 +143,7 @@
 -- >>> :set -XOverloadedStrings
 -- >>> runSafeT . runEffect $ each ["He","llo\r\n"] >-> toConnect "127.0.0.1" "9000"
 toConnect
-  :: (Ps.MonadSafe m, Ps.Base m ~ IO)
+  :: Ps.MonadSafe m
   => HostName        -- ^Server host name.
   -> ServiceName     -- ^Server service port.
   -> Consumer' B.ByteString m r
@@ -181,7 +181,7 @@
 -- >>> :set -XOverloadedStrings
 -- >>> runSafeT . runEffect $ fromServe 4096 "127.0.0.1" "9000" >-> P.print
 fromServe
-  :: (Ps.MonadSafe m, Ps.Base m ~ IO)
+  :: Ps.MonadSafe m
   => Int             -- ^Maximum number of bytes to receive and send
                      -- dowstream at once. Any positive value is fine, the
                      -- optimal value depends on how you deal with the
@@ -206,7 +206,7 @@
 -- >>> :set -XOverloadedStrings
 -- >>> runSafeT . runEffect $ each ["He","llo\r\n"] >-> toServe "127.0.0.1" "9000"
 toServe
-  :: (Ps.MonadSafe m, Ps.Base m ~ IO)
+  :: Ps.MonadSafe m
   => HostPreference  -- ^Preferred host to bind.
   -> ServiceName     -- ^Service port to bind.
   -> Consumer' B.ByteString m r
