diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Tracing
+# Tracing [![Stackage LTS](https://stackage.org/package/tracing/badge/lts)](https://stackage.org/lts/package/tracing) [![Stackage Nightly](https://stackage.org/package/tracing/badge/nightly)](https://stackage.org/nightly/package/tracing) [![Hackage](https://img.shields.io/hackage/v/tracing.svg)](https://hackage.haskell.org/package/tracing) [![Build Status](https://travis-ci.org/mtth/tracing.svg?branch=master)](https://travis-ci.org/mtth/tracing)
 
 An [OpenTracing](https://opentracing.io/)-compliant, simple, and extensible
 distributed tracing library.
diff --git a/src/Control/Monad/Trace.hs b/src/Control/Monad/Trace.hs
--- a/src/Control/Monad/Trace.hs
+++ b/src/Control/Monad/Trace.hs
@@ -34,6 +34,7 @@
 import Control.Monad.Reader.Class (MonadReader)
 import Control.Monad.Trans.Class (MonadTrans(..))
 import qualified Data.Aeson as JSON
+import Data.Foldable (for_)
 import Data.List (sortOn)
 import Data.Map.Strict (Map)
 import qualified Data.Map.Strict as Map
@@ -50,7 +51,7 @@
 -- | A collection of span logs.
 type Logs = [(POSIXTime, Key, JSON.Value)]
 
--- | A sampled span, and its associated metadata.
+-- | A sampled span and its associated metadata.
 data Sample = Sample
   { sampleSpan :: !Span
   -- ^ The sampled span.
@@ -150,15 +151,13 @@
 
   activeSpan = TraceT $ asks scopeSpan
 
-  addSpanEntry key (TagValue val) = TraceT $ asks scopeTags >>= \case
-    Nothing -> pure ()
-    Just tv -> atomically $ modifyTVar' tv $ Map.insert key val
-  addSpanEntry key (LogValue val maybeTime)  = TraceT $ asks scopeLogs >>= \case
-    Nothing -> pure ()
-    Just tv -> do
-      time <- case maybeTime of
-        Nothing -> liftIO getPOSIXTime
-        Just time' -> pure time'
+  addSpanEntry key (TagValue val) = TraceT $ do
+    mbTV <- asks scopeTags
+    for_ mbTV $ \tv -> atomically $ modifyTVar' tv $ Map.insert key val
+  addSpanEntry key (LogValue val mbTime)  = TraceT $ do
+    mbTV <- asks scopeLogs
+    for_ mbTV $ \tv -> do
+      time <- maybe (liftIO getPOSIXTime) pure mbTime
       atomically $ modifyTVar' tv ((time, key, val) :)
 
 instance MonadUnliftIO m => MonadUnliftIO (TraceT m) where
diff --git a/src/Control/Monad/Trace/Class.hs b/src/Control/Monad/Trace/Class.hs
--- a/src/Control/Monad/Trace/Class.hs
+++ b/src/Control/Monad/Trace/Class.hs
@@ -56,7 +56,7 @@
 
 -- | A monad capable of generating and modifying trace spans.
 --
--- There are currently two instances of this monad:
+-- This package currently provides two instances of this class:
 --
 -- * 'Control.Monad.Trace.TraceT', which emits spans for each trace in 'IO' and is meant to be used
 -- in production.
@@ -64,7 +64,9 @@
 -- or complex setup.
 class Monad m => MonadTrace m where
 
-  -- | Trace an action, wrapping it inside a new span.
+  -- | Trace an action, wrapping it inside a new span. If the action isn't currently being traced,
+  -- 'trace' should be a no-op. Otherwise, the new span should share the active span's trace ID,
+  -- sampling decision, and baggages unless overridden by the input 'Builder'.
   trace :: Builder -> m a -> m a
 
   -- | Extracts the currently active span, or 'Nothing' if the action is not being traced.
@@ -77,28 +79,28 @@
   default addSpanEntry :: (MonadTrace n, MonadTrans t, m ~ t n) => Key -> Value -> m ()
   addSpanEntry key = lift . addSpanEntry key
 
-instance (Monad m, MonadTrace m) => MonadTrace (ExceptT e m) where
+instance MonadTrace m => MonadTrace (ExceptT e m) where
   trace name (ExceptT actn) = ExceptT $ trace name actn
 
-instance (Monad m, MonadTrace m) => MonadTrace (ReaderT r m) where
+instance MonadTrace m => MonadTrace (ReaderT r m) where
   trace name (ReaderT actn) = ReaderT $ \r -> trace name (actn r)
 
-instance (Monad m, MonadTrace m, Monoid w) => MonadTrace (RWS.Lazy.RWST r w s m) where
+instance (MonadTrace m, Monoid w) => MonadTrace (RWS.Lazy.RWST r w s m) where
   trace name (RWS.Lazy.RWST actn) = RWS.Lazy.RWST $ \r s -> trace name (actn r s)
 
-instance (Monad m, MonadTrace m, Monoid w) => MonadTrace (RWS.Strict.RWST r w s m) where
+instance (MonadTrace m, Monoid w) => MonadTrace (RWS.Strict.RWST r w s m) where
   trace name (RWS.Strict.RWST actn) = RWS.Strict.RWST $ \r s -> trace name (actn r s)
 
-instance (Monad m, MonadTrace m) => MonadTrace (State.Lazy.StateT s m) where
+instance MonadTrace m => MonadTrace (State.Lazy.StateT s m) where
   trace name (State.Lazy.StateT actn) = State.Lazy.StateT $ \s -> trace name (actn s)
 
-instance (Monad m, MonadTrace m) => MonadTrace (State.Strict.StateT s m) where
+instance MonadTrace m => MonadTrace (State.Strict.StateT s m) where
   trace name (State.Strict.StateT actn) = State.Strict.StateT $ \s -> trace name (actn s)
 
-instance (Monad m, MonadTrace m, Monoid w) => MonadTrace (Writer.Lazy.WriterT w m) where
+instance (MonadTrace m, Monoid w) => MonadTrace (Writer.Lazy.WriterT w m) where
   trace name (Writer.Lazy.WriterT actn) = Writer.Lazy.WriterT $ trace name actn
 
-instance (Monad m, MonadTrace m, Monoid w) => MonadTrace (Writer.Strict.WriterT w m) where
+instance (MonadTrace m, Monoid w) => MonadTrace (Writer.Strict.WriterT w m) where
   trace name (Writer.Strict.WriterT actn) = Writer.Strict.WriterT $ trace name actn
 
 instance MonadTrace Identity where
diff --git a/src/Monitor/Tracing/Zipkin.hs b/src/Monitor/Tracing/Zipkin.hs
--- a/src/Monitor/Tracing/Zipkin.hs
+++ b/src/Monitor/Tracing/Zipkin.hs
@@ -63,8 +63,6 @@
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 import Data.Time.Clock.POSIX (POSIXTime)
-import Net.IPv4 (IPv4)
-import Net.IPv6 (IPv6)
 import Network.HTTP.Client (Manager, Request)
 import qualified Network.HTTP.Client as HTTP
 import Network.Socket (HostName, PortNumber)
@@ -369,9 +367,9 @@
   -- ^ The endpoint's service name.
   , endpointPort :: !(Maybe Int)
   -- ^ The endpoint's port, if applicable and known.
-  , endpointIPv4 :: !(Maybe IPv4)
+  , endpointIPv4 :: !(Maybe Text)
   -- ^ The endpoint's IPv4 address.
-  , endpointIPv6 :: !(Maybe IPv6)
+  , endpointIPv6 :: !(Maybe Text)
   -- ^ The endpoint's IPv6 address.
   } deriving (Eq, Ord, Show)
 
diff --git a/tracing.cabal b/tracing.cabal
--- a/tracing.cabal
+++ b/tracing.cabal
@@ -1,5 +1,5 @@
 name:                tracing
-version:             0.0.4.0
+version:             0.0.5.0
 synopsis:            Distributed tracing
 description:         An OpenTracing-compliant, simple, and extensible distributed tracing library.
 homepage:            https://github.com/mtth/tracing
@@ -21,6 +21,7 @@
                      , Monitor.Tracing.Local
                      , Monitor.Tracing.Zipkin
   other-modules:       Control.Monad.Trace.Internal
+  -- unliftio-core bound for https://github.com/fpco/unliftio/issues/55
   build-depends:       aeson >= 1.4
                      , base >= 4.8 && < 5
                      , base16-bytestring >= 0.1
@@ -28,7 +29,6 @@
                      , case-insensitive >= 1.2
                      , containers >= 0.6
                      , http-client >= 0.5
-                     , ip >= 1.4
                      , mtl >= 2.2
                      , network >= 2.8
                      , random >= 1.1
@@ -37,6 +37,7 @@
                      , time >= 1.8
                      , transformers >= 0.5
                      , unliftio >= 0.2
+                     , unliftio-core < 0.2
   default-language:    Haskell2010
   ghc-options:         -Wall
 
