diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.0.1
+
+- Made `on` visible.
+
 ## 0.1
 
 - Initial revision.
diff --git a/event.cabal b/event.cabal
--- a/event.cabal
+++ b/event.cabal
@@ -1,5 +1,5 @@
 name:                event
-version:             0.1
+version:             0.1.0.1
 synopsis:            Monoidal, monadic and first-class events
 description:         This package can be used to represent events as
                      first-class objects instead of deepening callbacks and
diff --git a/src/Control/Concurrent/Event.hs b/src/Control/Concurrent/Event.hs
--- a/src/Control/Concurrent/Event.hs
+++ b/src/Control/Concurrent/Event.hs
@@ -50,6 +50,7 @@
 module Control.Concurrent.Event (
     -- * Events
     Event
+  , on
   , newEvent
     -- * Triggering events
   , Trigger
@@ -70,7 +71,7 @@
 --
 -- 'Event's can be triggered with the 'trigger' function and the associated
 -- type 'Trigger'.
-newtype Event a = Event { on :: (a -> IO ()) -> IO Detach }
+newtype Event a = Event ((a -> IO ()) -> IO Detach)
 
 instance Applicative Event where
   pure x = Event $ \k -> k x >> pure mempty
@@ -95,6 +96,10 @@
 
 instance Semigroup (Event a) where
   a <> b = Event $ \k -> (<>) <$> on a k <*> on b k
+
+-- |Register an action.
+on :: (MonadIO m) => Event a -> (a -> IO ()) -> m Detach
+on (Event register) f = liftIO $ register f
 
 -- |'Detach' is used to detach an action from an 'Event'.
 newtype Detach = Detach { detach :: IO () }
