diff --git a/aztecs.cabal b/aztecs.cabal
--- a/aztecs.cabal
+++ b/aztecs.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.4
 name:          aztecs
-version:       0.17.0
+version:       0.17.1
 license:       BSD-3-Clause
 license-file:  LICENSE
 maintainer:    matt@hunzinger.me
@@ -67,32 +67,6 @@
         containers >=0.6,
         mtl >=2,
         vector >=0.12
-
-executable ecs
-    main-is:          examples/ECS.hs
-    default-language: Haskell2010
-    ghc-options:      -Wall
-    build-depends:
-        base,
-        aztecs
-
-executable lifecycle
-    main-is:          examples/Lifecycle.hs
-    default-language: Haskell2010
-    ghc-options:      -Wall
-    build-depends:
-        base,
-        aztecs
-
-executable observers
-    main-is:          examples/Observers.hs
-    default-language: Haskell2010
-    ghc-options:      -Wall
-    build-depends:
-        base,
-        aztecs,
-        mtl,
-        vector
 
 test-suite aztecs-test
     type:             exitcode-stdio-1.0
diff --git a/examples/ECS.hs b/examples/ECS.hs
deleted file mode 100644
--- a/examples/ECS.hs
+++ /dev/null
@@ -1,30 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Main where
-
-import Aztecs.ECS
-import Control.Monad.IO.Class
-
-newtype Position = Position Int deriving (Show)
-
-instance (Monad m) => Component m Position
-
-newtype Velocity = Velocity Int deriving (Show)
-
-instance (Monad m) => Component m Velocity
-
-move :: (Monad m) => Query m Position
-move = queryMapWith go query
-  where
-    go (Velocity v) (Position p) = Position $ p + v
-
-app :: Access IO ()
-app = do
-  spawn_ $ bundle (Position 0) <> bundle (Velocity 1)
-  positions <- system $ runQuery move
-  liftIO $ print positions
-
-main :: IO ()
-main = runAccess_ app
diff --git a/examples/Lifecycle.hs b/examples/Lifecycle.hs
deleted file mode 100644
--- a/examples/Lifecycle.hs
+++ /dev/null
@@ -1,30 +0,0 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeApplications #-}
-
-module Main where
-
-import Aztecs.ECS
-import Control.Monad.IO.Class
-
-newtype X = X Int deriving (Show)
-
-instance Component IO X where
-  componentOnInsert = exampleHook "insert"
-  componentOnChange e _ = exampleHook "change" e
-  componentOnRemove = exampleHook "remove"
-
-exampleHook :: String -> EntityID -> X -> Access IO ()
-exampleHook s e x = liftIO . putStrLn $ s ++ " " ++ show e ++ ": " ++ show x
-
-addTen :: Query IO X
-addTen = queryMap (\(X n) -> X (n + 10))
-
-app :: Access IO ()
-app = do
-  e <- spawn $ bundle (X 1)
-  _ <- system $ runQuery addTen
-  _ <- remove @IO @X e
-  return ()
-
-main :: IO ()
-main = runAccess_ app
diff --git a/examples/Observers.hs b/examples/Observers.hs
deleted file mode 100644
--- a/examples/Observers.hs
+++ /dev/null
@@ -1,40 +0,0 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeApplications #-}
-
-module Main where
-
-import Aztecs.ECS
-import Control.Monad.IO.Class
-
-newtype Health = Health Int
-  deriving (Show)
-
-instance Component IO Health
-
-heal :: Query IO Health
-heal = queryMap (\(Health h) -> Health (h + 10))
-
-run :: Access IO ()
-run = do
-  -- Spawn a player with health
-  player <- spawn . bundle $ Health 100
-
-  -- Spawn observers that react to lifecycle events on the player's Health component
-  _ <- spawn . bundle . observer @IO @(OnInsert Health) player $ \e (OnInsert h) ->
-    observe "insert" e h
-  _ <- spawn . bundle . observer @IO @(OnChange Health) player $ \e change ->
-    liftIO . putStrLn $ "change " ++ show e ++ ": old=" ++ show (onChangeOld change) ++ ", new=" ++ show (onChangeNew change)
-  _ <- spawn . bundle . observer @IO @(OnRemove Health) player $ \e (OnRemove h) ->
-    observe "remove" e h
-
-  -- Trigger events by inserting, changing, and removing the Health component
-  _ <- insert player . bundle $ Health 150
-  _ <- system $ runQuery heal
-  _ <- remove @_ @Health player
-
-  return ()
-  where
-    observe s e h = liftIO . putStrLn $ s ++ " " ++ show e ++ ": " ++ show h
-
-main :: IO ()
-main = runAccess_ run
diff --git a/src/Aztecs/ECS/Access/Internal.hs b/src/Aztecs/ECS/Access/Internal.hs
--- a/src/Aztecs/ECS/Access/Internal.hs
+++ b/src/Aztecs/ECS/Access/Internal.hs
@@ -38,6 +38,9 @@
 newtype Access m a = Access {unAccess :: StateT (World m) m a}
   deriving (Functor, Applicative, Monad, MonadFix, MonadIO)
 
+instance MonadTrans Access where
+  lift = Access . lift
+
 -- | Run an `Access` with a given `World`, returning the result and updated world.
 runAccessWith :: Access m a -> World m -> m (a, World m)
 runAccessWith a = runStateT (unAccess a)
