diff --git a/eve.cabal b/eve.cabal
--- a/eve.cabal
+++ b/eve.cabal
@@ -1,5 +1,5 @@
 name:                eve
-version:             0.1.7
+version:             0.1.8
 synopsis: An extensible event framework
 description: An extensible event-driven application framework in haskell for building embarassingly modular software.
 homepage:            https://github.com/ChrisPenner/eve#readme
diff --git a/src/Eve/Internal/Actions.hs b/src/Eve/Internal/Actions.hs
--- a/src/Eve/Internal/Actions.hs
+++ b/src/Eve/Internal/Actions.hs
@@ -42,6 +42,13 @@
   { getAction :: FreeT (AppF base m) (StateT zoomed m) a
   } deriving (Functor, Applicative, Monad, MonadIO, MonadState zoomed)
 
+instance (Monoid a, Monad m) => Monoid (ActionT base zoomed m a) where
+  mempty = return mempty
+  a `mappend` b = do
+    a' <- a
+    b' <- b
+    return $ a' `mappend` b'
+
 instance Monad n => MonadFree (AppF base n) (ActionT base zoomed n) where
   wrap (RunApp act) = join . ActionT . liftF . RunApp $ act
 
diff --git a/test/Eve/Internal/ActionsSpec.hs b/test/Eve/Internal/ActionsSpec.hs
--- a/test/Eve/Internal/ActionsSpec.hs
+++ b/test/Eve/Internal/ActionsSpec.hs
@@ -34,6 +34,15 @@
   myString .= "Hello!"
   use myString
 
+monoidTest :: ActionT AppState SimpleState Identity (String, [Int])
+monoidTest = do
+  result <- one `mappend` two
+  str <- use myString
+  return (str, result)
+  where
+    one = myString .= "first" >> return [1]
+    two = myString <>= "second" >> return [2]
+
 spec :: Spec
 spec = do
   describe "Exiting" $ do
@@ -64,3 +73,8 @@
     it "compiles" $
       let (alterationResult, _) = noIOTest (runAction alterSimpleState :: AppT AppState Identity String)
        in alterationResult `shouldBe` "Hello!"
+
+  describe "is a Monoid" $ do
+    it "combines results and effects" $
+      let (monoidResult, _) = noIOTest (runAction monoidTest :: AppT AppState Identity (String, [Int]))
+       in monoidResult `shouldBe` ("firstsecond", [1, 2])
