There has already been considerable research on constructing modular, monad-based specications of computational eects (state, exceptions, nondeterminism, etc.) in programming languages. We present a simple framework in this tradition, based on a Church-style eect-typing system for an ML-like language. The semantics of this language is formally de ned by a series of monadic translations, each one expanding away a layer of eects. Such a layered specication is easy to reason about, but its direct implementation (whether by parameterized interpretation or by actual translation) is often prohibitively ine��cient. By exploiting deeper semantic properties of monads, however, it is also possible to derive a vastly more e��cient implementation: we show that each layer of eects can be uniformly simulated by continuation-passing, and further that multiple such layers can themselves be simulated by a standard semantics for call/cc and mutable state. Thus, even multi-eect programs can be executed in Scheme or SML/NJ at full native speed, generalizing an earlier single-eect result. As an example, we show how a simple resumptionbased semantics of concurrency allows us to directly simulate a shared-state program across all possible dynamic interleavings of execution threads.