diff --git a/Control/Arrow/Abort.hs b/Control/Arrow/Abort.hs
--- a/Control/Arrow/Abort.hs
+++ b/Control/Arrow/Abort.hs
@@ -7,7 +7,12 @@
 import Control.Arrow;
 import Control.Arrow.Transformer;
 import Control.Arrow.Abort.Class;
+import Util;
 
+import Data.Typeable;
+import Data.Dynamic;
+import Control.Exception;
+
 newtype AbortT v r a b = AbortT { unwrapAbortT :: r a (Either v b) };
 
 runAbortT :: Arrow r => AbortT v r a v -> r a v;
@@ -29,8 +34,16 @@
   second = AbortT . (>>> arr (uncurry (liftM2 (,)))) . (arr Right ***) . unwrapAbortT;
 };
 
+instance (ArrowChoice r, ArrowApply r) => ArrowApply (AbortT v r) where {
+  app = AbortT (arr unwrapAbortT *** id >>> app);
+};
+
+instance (ArrowChoice r, ArrowLoop r, Typeable v) => ArrowLoop (AbortT v r) where {
+  loop (AbortT a) = AbortT (loop (a >>> (id +++ arr fst) &&& (arr (throw . toDyn) ||| arr snd)));
+};
+
 instance (ArrowChoice r) => ArrowAbort v (AbortT v r) where {
-  abort = AbortT $ arr Left;
+  abort = AbortT (arr Left);
 };
 
 instance (ArrowChoice r, ArrowTransformer xT, Arrow (xT (AbortT v r))) => ArrowAbort v (xT (AbortT v r)) where {
diff --git a/Control/Arrow/Reader.hs b/Control/Arrow/Reader.hs
--- a/Control/Arrow/Reader.hs
+++ b/Control/Arrow/Reader.hs
@@ -30,6 +30,18 @@
   app = ReaderT (arr (\ ((ReaderT f, x), r) -> (f, (x, r))) >>> app);
 };
 
+instance (ArrowZero s) => ArrowZero (ReaderT r s) where {
+  zeroArrow = ReaderT zeroArrow;
+};
+
+instance (ArrowPlus s) => ArrowPlus (ReaderT r s) where {
+  ReaderT f <+> ReaderT g = ReaderT (f <+> g);
+};
+
+instance (ArrowLoop s) => ArrowLoop (ReaderT r s) where {
+  loop = ReaderT . loop . (<<< swap_snds_A) . runReaderT;
+};
+
 instance (Arrow s) => ArrowReader r (ReaderT r s) where {
   ask   = ReaderT (arr snd);
   local = withReaderT . arr;
diff --git a/Control/Arrow/State.hs b/Control/Arrow/State.hs
--- a/Control/Arrow/State.hs
+++ b/Control/Arrow/State.hs
@@ -29,6 +29,18 @@
   app = StateT $ arr (\ ((StateT f, x), s) -> (f, (x, s))) >>> app;
 };
 
+instance (ArrowZero r) => ArrowZero (StateT s r) where {
+  zeroArrow = StateT zeroArrow;
+};
+
+instance (ArrowPlus r) => ArrowPlus (StateT s r) where {
+  StateT f <+> StateT g = StateT (f <+> g);
+};
+
+instance (ArrowLoop r) => ArrowLoop (StateT s r) where {
+  loop = StateT . loop . (>>> swap_snds_A) . (<<< swap_snds_A) . runStateT;
+};
+
 instance (Arrow r) => ArrowState s (StateT s r) where {
   get = StateT $ arr $ \ (_, s) -> (s,  s);
   put = StateT $ arr $ \ (s, _) -> ((), s);
diff --git a/Control/Arrow/Writer.hs b/Control/Arrow/Writer.hs
--- a/Control/Arrow/Writer.hs
+++ b/Control/Arrow/Writer.hs
@@ -33,6 +33,18 @@
   app = WriterT $ arr runWriterT *** id >>> app;
 };
 
+instance (Monoid w, ArrowZero r) => ArrowZero (WriterT w r) where {
+  zeroArrow = WriterT zeroArrow;
+};
+
+instance (Monoid w, ArrowPlus r) => ArrowPlus (WriterT w r) where {
+  WriterT f <+> WriterT g = WriterT (f <+> g);
+};
+
+instance (Monoid w, ArrowLoop r) => ArrowLoop (WriterT w r) where {
+  loop = WriterT . loop . (>>> swap_snds_A) . runWriterT;
+};
+
 instance (Monoid w, Arrow r) => ArrowWriter w (WriterT w r) where {
   tell = WriterT $ constA () &&& id;
   look = lift (runWriterT id);
diff --git a/atl.cabal b/atl.cabal
--- a/atl.cabal
+++ b/atl.cabal
@@ -1,5 +1,5 @@
 Name:atl
-Version:15322.1
+Version:15322.2
 Description:Arrow Transformer Library
 License:LGPL
 License-File:license.txt
