diff --git a/network-metrics.cabal b/network-metrics.cabal
--- a/network-metrics.cabal
+++ b/network-metrics.cabal
@@ -1,5 +1,5 @@
 name:               network-metrics
-version:            0.1.2
+version:            0.1.3
 synopsis:           Send metrics to Ganglia, Graphite, and statsd.
 license:            OtherLicense
 license-file:       LICENSE
@@ -32,7 +32,8 @@
   location: git://github.com/brendanhay/network-metrics.git
 
 library
-  exposed-modules:  Network.Metrics.Ganglia
+  exposed-modules:  Network.Metrics
+                  , Network.Metrics.Ganglia
                   , Network.Metrics.Graphite
                   , Network.Metrics.Statsd
   other-modules:    Network.Metrics.Internal
diff --git a/src/GMetric.hs b/src/GMetric.hs
--- a/src/GMetric.hs
+++ b/src/GMetric.hs
@@ -48,7 +48,10 @@
 --
 
 emit :: Options -> IO ()
-emit Options{..} = G.open optHost optPort >>= G.emit metric >>= G.close
+emit Options{..} = do
+    handle <- G.open optHost optPort
+    G.emit metric handle
+    G.close handle
   where
     metric = G.Metric
         (pack optName)
diff --git a/src/Network/Metrics.hs b/src/Network/Metrics.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Metrics.hs
@@ -0,0 +1,18 @@
+-- |
+-- Module      : Network.Metrics
+-- Copyright   : (c) 2012 Brendan Hay <brendan@soundcloud.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan@soundcloud.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+
+module Network.Metrics (
+    -- * Re-exported types
+      Handle(..)
+    ) where
+
+import Network.Metrics.Internal
diff --git a/src/Network/Metrics/Ganglia.hs b/src/Network/Metrics/Ganglia.hs
--- a/src/Network/Metrics/Ganglia.hs
+++ b/src/Network/Metrics/Ganglia.hs
@@ -97,12 +97,12 @@
 open = I.open Datagram
 
 -- | Emit a metric's metadata and value on the specified socket handle
-emit :: Metric -> I.Handle -> IO I.Handle
+emit :: Metric -> I.Handle -> IO ()
 emit metric handle@(I.Handle sock addr) = do
     sIsConnected sock >>= \b -> unless b $ connect sock addr
     _ <- push putMetaData handle
     _ <- push putMetric handle
-    return handle
+    return ()
   where
     push fn = I.emit . runPut $ fn metric
 
@@ -204,6 +204,6 @@
     loop h = do
         r <- randomRIO variance :: IO Int
         n <- sample ["magic", "candy", "unicorns"]
-        f <- emit defaultMetric { name = n, value = BS.pack $ show r } h
+        emit defaultMetric { name = n, value = BS.pack $ show r } h
         threadDelay oneSecond
-        loop f
+        loop h
diff --git a/src/Network/Metrics/Graphite.hs b/src/Network/Metrics/Graphite.hs
--- a/src/Network/Metrics/Graphite.hs
+++ b/src/Network/Metrics/Graphite.hs
@@ -44,7 +44,7 @@
 open = I.open Stream
 
 -- | Emit a metric's metadata and value on the specified socket handle
-emit :: Metric -> I.Handle -> IO I.Handle
+emit :: Metric -> I.Handle -> IO ()
 emit Metric{..} handle = do
     time <- getPOSIXTime
     I.emit (encoded time) handle
diff --git a/src/Network/Metrics/Internal.hs b/src/Network/Metrics/Internal.hs
--- a/src/Network/Metrics/Internal.hs
+++ b/src/Network/Metrics/Internal.hs
@@ -45,9 +45,9 @@
 close (Handle sock _) = sClose sock
 
 -- | Push an encoded metric to the specified socket handle
-emit :: BL.ByteString -> Handle -> IO Handle
-emit bstr handle@(Handle sock addr) | BL.null bstr = return handle
-                                    | otherwise    = do
+emit :: BL.ByteString -> Handle -> IO ()
+emit bstr (Handle sock addr) | BL.null bstr = return ()
+                             | otherwise    = do
     sIsConnected sock >>= \b -> unless b $ connect sock addr
     _ <- send sock bstr
-    return handle
+    return ()
diff --git a/src/Network/Metrics/Statsd.hs b/src/Network/Metrics/Statsd.hs
--- a/src/Network/Metrics/Statsd.hs
+++ b/src/Network/Metrics/Statsd.hs
@@ -12,7 +12,7 @@
 
 module Network.Metrics.Statsd (
     -- * Exported types
-      MetricType
+      MetricType(..)
     , Metric(..)
 
     -- * Socket Handle operations
@@ -36,7 +36,7 @@
 data Metric = Metric
     { type'  :: MetricType
     , bucket :: BS.ByteString
-    , value  :: Integer
+    , value  :: BS.ByteString
     , rate   :: Double
     } deriving (Show)
 
@@ -51,7 +51,7 @@
 open = I.open Datagram
 
 -- | Emit a metric's metadata and value on the specified socket handle
-emit :: Metric -> I.Handle -> IO I.Handle
+emit :: Metric -> I.Handle -> IO ()
 emit metric handle = do
     rand <- randomRIO (0.0, 1.0)
     I.emit (encoded rand) handle
@@ -73,7 +73,7 @@
     Exact   -> base
     Ignore  -> []
   where
-    base = [bucket, ":", BS.pack $ show value, "|", suffix type']
+    base = [bucket, ":", value, "|", suffix type']
 
 suffix :: MetricType -> BS.ByteString
 suffix typ = case typ of
