diff --git a/src/Control/Monad/Stats/MTL.hs b/src/Control/Monad/Stats/MTL.hs
--- a/src/Control/Monad/Stats/MTL.hs
+++ b/src/Control/Monad/Stats/MTL.hs
@@ -19,13 +19,16 @@
     , MTLStatsT, mtlStatsT
     ) where
 
-import           Control.Monad.Ether
 import           Control.Monad.IO.Class
 import qualified Control.Monad.Stats.Monad as Ethereal
 import           Control.Monad.Stats.Types
 import           Data.Time.Clock           (NominalDiffTime)
+import           Data.Proxy                (Proxy(..))
+import           Ether
 
-ethereal "MTLStatsT" "mtlStatsT"
+data MTLStatsT
+mtlStatsT :: Proxy MTLStatsT
+mtlStatsT = Proxy
 
 type MonadStats m = (Monad m, MonadIO m, Ethereal.MonadStats MTLStatsT m)
 type StatsT = Ethereal.StatsT MTLStatsT
diff --git a/src/Control/Monad/Stats/Monad.hs b/src/Control/Monad/Stats/Monad.hs
--- a/src/Control/Monad/Stats/Monad.hs
+++ b/src/Control/Monad/Stats/Monad.hs
@@ -1,9 +1,11 @@
-{-# LANGUAGE ConstraintKinds       #-}
-{-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE LambdaCase            #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings     #-}
-{-# LANGUAGE RecordWildCards       #-}
+{-# LANGUAGE ConstraintKinds        #-}
+{-# LANGUAGE FlexibleContexts       #-}
+{-# LANGUAGE ScopedTypeVariables    #-}
+{-# LANGUAGE TypeApplications       #-}
+{-# LANGUAGE LambdaCase             #-}
+{-# LANGUAGE MultiParamTypeClasses  #-}
+{-# LANGUAGE OverloadedStrings      #-}
+{-# LANGUAGE RecordWildCards        #-}
 module Control.Monad.Stats.Monad
     ( MonadStats
     , StatsT(..)
@@ -24,7 +26,7 @@
 import           Control.Concurrent
 import           Control.Concurrent.STM
 import           Control.Exception         (AsyncException (..), fromException)
-import           Control.Monad.Ether
+import           Control.Monad (forever, forM_, when, void)
 import           Control.Monad.IO.Class
 import           Control.Monad.Stats.Types
 import           Control.Monad.Stats.Util
@@ -37,6 +39,7 @@
 import           Data.IORef
 import           Data.Time                 (NominalDiffTime)
 import           Data.Time.Clock.POSIX     (POSIXTime, getPOSIXTime)
+import           Ether.Reader
 import qualified Network.Socket            as Socket hiding (recv, recvFrom,
                                                       send, sendTo)
 import qualified Network.Socket.ByteString as Socket
@@ -55,7 +58,7 @@
 withSocket tag m = withEnvironment tag $ \e -> borrowTMVar (envSocket e) m
 
 withEnvironment :: (MonadStats tag m) => proxy tag -> (StatsTEnvironment -> m ()) -> m ()
-withEnvironment tag f = ask tag >>= \case
+withEnvironment (t :: proxy tag) f = (ask @tag) >>= \case
     NoStatsTEnvironment -> return ()
     env -> f env
 
@@ -144,7 +147,7 @@
                                                 ]
 
 reportServiceCheck :: (MonadStats tag m) => proxy tag -> ServiceCheck -> ServiceCheckValue -> m ()
-reportServiceCheck t ServiceCheck{..} ServiceCheckValue{..} = ask t >>= \case
+reportServiceCheck (t :: proxy tag) ServiceCheck{..} ServiceCheckValue{..} = (ask @tag) >>= \case
     NoStatsTEnvironment -> return ()
     env -> do
         timestamp <- case scvTimestamp of
@@ -224,7 +227,7 @@
     (socket, addr) <- mkStatsDSocket c
     liftIO $ borrowTMVar socket (`Socket.connect` addr)
     theEnv <- mkStatsTEnv c socket
-    flip (runReaderT t) theEnv $ do
+    flip runReaderT theEnv $ do
         tid <- forkStatsThread theEnv
         ret <- m
         reportSamples theEnv -- just in case our actions ran faster than 2x flush interval
@@ -232,4 +235,4 @@
         return ret
 
 runNoStatsT :: (MonadIO m) => proxy t -> StatsT t m a -> m a
-runNoStatsT t = flip (runReaderT t) NoStatsTEnvironment
+runNoStatsT t = flip runReaderT NoStatsTEnvironment
diff --git a/src/Control/Monad/Stats/Types.hs b/src/Control/Monad/Stats/Types.hs
--- a/src/Control/Monad/Stats/Types.hs
+++ b/src/Control/Monad/Stats/Types.hs
@@ -6,7 +6,6 @@
 module Control.Monad.Stats.Types where
 
 import           Control.Concurrent.STM (TMVar)
-import           Control.Monad.Ether
 import           Control.Monad.IO.Class
 import           Data.ByteString        (ByteString)
 import qualified Data.ByteString        as ByteString
@@ -17,6 +16,7 @@
 import qualified Data.HashMap.Strict    as HashMap
 import           Data.IORef
 import           Data.Time.Clock.POSIX  (POSIXTime)
+import           Ether
 import           Network.Socket         (Socket)
 import           System.Random          (Random)
 
diff --git a/statsdi.cabal b/statsdi.cabal
--- a/statsdi.cabal
+++ b/statsdi.cabal
@@ -1,5 +1,5 @@
 name:                statsdi
-version:             0.1.0.0
+version:             0.2.0.0
 synopsis:            A lovely [Dog]StatsD implementation
 description:         An implementation of DogStatsD for collecting and pushing metrics
 homepage:            https://github.com/iostat/statsdi#readme
@@ -32,7 +32,7 @@
                      , ether
                      , transformers
                      , transformers-lift
-                     , template-haskell >= 2.11.1.0 && < 2.12
+                     , template-haskell >= 2.11.1.0 && < 2.13
                      , unordered-containers >= 0.2.7.0 && < 0.3
                      , hashable >= 1.2.4.0 && < 1.3
   default-language:    Haskell2010
