diff --git a/Network/Socks5.hs b/Network/Socks5.hs
--- a/Network/Socks5.hs
+++ b/Network/Socks5.hs
@@ -29,7 +29,7 @@
 -- this structure will be extended in future to support authentification.
 -- use defaultSocksConf to create new record.
 data SocksConf = SocksConf
-	{ socksHost    :: String -- ^ SOCKS host.
+	{ socksHost    :: String     -- ^ SOCKS host.
 	, socksPort    :: PortNumber -- ^ SOCKS port.
 	, socksVersion :: Int        -- ^ SOCKS version to use, only 5 supported for now.
 	}
@@ -64,26 +64,29 @@
 	_ <- socks5ConnectDomainName sock destination port
 	return ()
 
--- | similar to Network connectTo but use a socks proxy.
-socksConnectTo :: String -> PortID -> String -> PortID -> IO Handle
-socksConnectTo sockshost socksport desthost destport = do
-	sport <- resolvePortID socksport
+-- | create a new socket and connect in to a destination through the specified
+-- SOCKS configuration.
+socksConnectWith :: SocksConf -- ^ SOCKS configuration
+                 -> String    -- ^ destination hostname
+                 -> PortID    -- ^ destination port
+                 -> IO Socket
+socksConnectWith sockConf desthost destport = do
 	dport <- resolvePortID destport
-
 	proto <- getProtocolNumber "tcp"
-	bracketOnError (socket AF_INET Stream proto) sClose (go sport dport)
-	where
-		go sport dport sock = do
-			he <- getHostByName sockshost
-			let sockaddr = SockAddrInet sport (hostAddress he)
-			socksConnectName sock sockaddr desthost dport
-			socketToHandle sock ReadWriteMode
+	bracketOnError (socket AF_INET Stream proto) sClose $ \sock -> do
+		he <- getHostByName $ socksHost sockConf
+		let sockaddr = SockAddrInet (socksPort sockConf) (hostAddress he)
+		socksConnectName sock sockaddr desthost dport
+		return sock
 
-		resolvePortID (Service serv) = getServicePortNumber serv
-		resolvePortID (PortNumber n) = return n
-		resolvePortID _              = error "unsupported unix PortID"
+-- | similar to Network connectTo but use a socks proxy with default socks configuration.
+socksConnectTo :: String -> PortID -> String -> PortID -> IO Handle
+socksConnectTo sockshost socksport desthost destport = do
+	sport <- resolvePortID socksport
+	let socksConf = defaultSocksConf sockshost sport
+	sock <- socksConnectWith socksConf desthost destport
+	socketToHandle sock ReadWriteMode
 
--- | like socksConnectTo but specify the socks configuration directly.
-socksConnectWith :: SocksConf -> String -> PortID -> IO Handle
-socksConnectWith socksConf =
-	socksConnectTo (socksHost socksConf) (PortNumber $ socksPort socksConf)
+resolvePortID (Service serv) = getServicePortNumber serv
+resolvePortID (PortNumber n) = return n
+resolvePortID _              = error "unsupported unix PortID"
diff --git a/socks.cabal b/socks.cabal
--- a/socks.cabal
+++ b/socks.cabal
@@ -1,5 +1,5 @@
 Name:                socks
-Version:             0.3.0
+Version:             0.4.0
 Description:         Socks proxy (version 5) implementation.
 License:             BSD3
 License-file:        LICENSE
