diff --git a/dunai.cabal b/dunai.cabal
--- a/dunai.cabal
+++ b/dunai.cabal
@@ -1,5 +1,5 @@
 name:                dunai
-version:             0.6.0
+version:             0.7.0
 synopsis:            Generalised reactive framework supporting classic, arrowized and monadic FRP.
 homepage:            https://github.com/ivanperez-keera/dunai
 description:
@@ -88,9 +88,12 @@
   default-language:  Haskell2010
   ghc-options:       -Wall -fno-warn-unused-do-bind
 
+  if impl(ghc <= 7.8.4)
+    build-depends: transformers-compat
+
 test-suite hlint
   type: exitcode-stdio-1.0
-  main-is: hlint.hs
+  main-is: HLintMain.hs
   hs-source-dirs: tests
   default-language:  Haskell2010
   if !flag(test-hlint)
@@ -121,3 +124,16 @@
 source-repository head
   type:     git
   location: git@github.com:ivanperez-keera/dunai.git
+
+test-suite regression-tests
+  type: exitcode-stdio-1.0
+  main-is: RegressionTests.hs
+  ghc-options: -Wall
+  hs-source-dirs: tests
+  default-language:  Haskell2010
+  build-depends:
+    base >=4 && <5,
+    transformers,
+    dunai,
+    tasty,
+    tasty-hunit
diff --git a/src/Control/Monad/Trans/MSF/Except.hs b/src/Control/Monad/Trans/MSF/Except.hs
--- a/src/Control/Monad/Trans/MSF/Except.hs
+++ b/src/Control/Monad/Trans/MSF/Except.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE Arrows              #-}
 {-# LANGUAGE CPP                 #-}
 {-# LANGUAGE Rank2Types          #-}
+{-# LANGUAGE TupleSections       #-}
 -- | 'MSF's in the 'ExceptT' monad are monadic stream functions
 --   that can throw exceptions,
 --   i.e. return an exception value instead of a continuation.
@@ -173,6 +174,7 @@
 -- | Monad instance for 'MSFExcept'. Bind uses the exception as the 'return'
 -- value in the monad.
 instance Monad m => Monad (MSFExcept m a b) where
+  return = pure
   MSFExcept msf >>= f = MSFExcept $ handleExceptT msf $ runMSFExcept . f
 
 handleExceptT
@@ -224,6 +226,17 @@
   (b, e) <- arrM (lift . f) -< a
   _      <- throwOn'        -< (n > (1 :: Int), e)
   returnA                   -< b
+
+-- | Advances a single tick outputting the value,
+--   and then throws '()'.
+step_ :: Monad m => b -> MSFExcept m a b ()
+step_ = step . const . return . (, ())
+
+-- | Converts a list to an 'MSFExcept',
+--   which outputs an element of the list at each step,
+--   throwing '()' when the list ends.
+listToMSFExcept :: Monad m => [b] -> MSFExcept m a b ()
+listToMSFExcept = mapM_ step_
 
 -- * Utilities definable in terms of 'MSFExcept'
 
diff --git a/src/Control/Monad/Trans/MSF/Maybe.hs b/src/Control/Monad/Trans/MSF/Maybe.hs
--- a/src/Control/Monad/Trans/MSF/Maybe.hs
+++ b/src/Control/Monad/Trans/MSF/Maybe.hs
@@ -65,11 +65,15 @@
 
 -- * Converting to and from 'MaybeT'
 
+-- | Convert exceptions into `Nothing`, discarding the exception value.
+exceptToMaybeS :: (Functor m, Monad m) => MSF (ExceptT e m) a b -> MSF (MaybeT m) a b
+exceptToMaybeS = morphS $ MaybeT . fmap (either (const Nothing) Just) . runExceptT
+
 -- | Converts a list to an 'MSF' in 'MaybeT',
 --   which outputs an element of the list at each step,
 --   throwing 'Nothing' when the list ends.
-listToMaybeS :: Monad m => [b] -> MSF (MaybeT m) a b
-listToMaybeS = foldr iPost exit
+listToMaybeS :: (Functor m, Monad m) => [b] -> MSF (MaybeT m) a b
+listToMaybeS = exceptToMaybeS . runMSFExcept . listToMSFExcept
 
 -- * Running 'MaybeT'
 -- | Remove the 'MaybeT' layer by outputting 'Nothing' when the exception occurs.
diff --git a/tests/HLintMain.hs b/tests/HLintMain.hs
new file mode 100644
--- /dev/null
+++ b/tests/HLintMain.hs
@@ -0,0 +1,23 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Main (hlint)
+-- Copyright   :  (C) 2013 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+-- Maintainer  :  Ivan Perez <ivan.perez@keera.co.uk>
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- This module runs HLint on the lens source tree.
+-----------------------------------------------------------------------------
+module Main where
+
+import Control.Monad
+import Language.Haskell.HLint
+import System.Environment
+import System.Exit
+
+main :: IO ()
+main = do
+    args <- getArgs
+    hints <- hlint $ ["src", "--cross", "--hint=tests/HLint.hs" ] ++ args
+    unless (null hints) exitFailure
diff --git a/tests/RegressionTests.hs b/tests/RegressionTests.hs
new file mode 100644
--- /dev/null
+++ b/tests/RegressionTests.hs
@@ -0,0 +1,20 @@
+module Main where
+
+-- transformers
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Writer.Lazy
+
+-- dunai
+import Control.Monad.Trans.MSF.Maybe
+import Data.MonadicStreamFunction
+
+-- tasty
+import Test.Tasty
+import Test.Tasty.HUnit
+
+main :: IO ()
+main = defaultMain $ testGroup "listToMaybeS"
+    [ testCase "First emits all list elements before throwing exception" $
+        "Hello" @?= (execWriter $ runMaybeT $ flip embed [(1 :: Integer)..] $ listToMaybeS ["H", "el", "lo"] >>> arrM (tell >>> lift))
+    ]
diff --git a/tests/hlint.hs b/tests/hlint.hs
deleted file mode 100644
--- a/tests/hlint.hs
+++ /dev/null
@@ -1,23 +0,0 @@
------------------------------------------------------------------------------
--- |
--- Module      :  Main (hlint)
--- Copyright   :  (C) 2013 Edward Kmett
--- License     :  BSD-style (see the file LICENSE)
--- Maintainer  :  Edward Kmett <ekmett@gmail.com>
--- Stability   :  provisional
--- Portability :  portable
---
--- This module runs HLint on the lens source tree.
------------------------------------------------------------------------------
-module Main where
-
-import Control.Monad
-import Language.Haskell.HLint
-import System.Environment
-import System.Exit
-
-main :: IO ()
-main = do
-    args <- getArgs
-    hints <- hlint $ ["src", "--cross", "--hint=tests/HLint.hs" ] ++ args
-    unless (null hints) exitFailure
