diff --git a/src/flow/traversible/unbalanced.rs b/src/flow/traversible/unbalanced.rs
index b0f67fe..aab785c 100644
--- a/src/flow/traversible/unbalanced.rs
+++ b/src/flow/traversible/unbalanced.rs
@@ -282,7 +282,7 @@ mod tests {
             None,
             None,
         );
-        assert!(traced.a.is_ok());
-        // panic!("{:?}", traced.render().to_vec());D
+        assert!(traced.value.is_ok());
+        // panic!("{:?}", traced.render().to_vec());
     }
 }
diff --git a/src/func/classes/effect.rs b/src/func/classes/effect.rs
index e5f29f3..c23f8a6 100644
--- a/src/func/classes/effect.rs
+++ b/src/func/classes/effect.rs
@@ -1,11 +1,11 @@
 use crate::func::*;
 
 pub trait Effect {
-    fn pure() -> Self;
+    fn e_pure() -> Self;
 
-    fn seq(lhs: Self, rhs: Self) -> Self;
+    fn e_seq(lhs: Self, rhs: Self) -> Self;
 
-    fn after(self, effect: Self) -> Self;
+    fn e_after(self, effect: Self) -> Self;
 }
 
 #[derive(Clone)]
@@ -15,10 +15,10 @@ pub struct WithEffect {
 }
 
 impl WithEffect {
-    fn after(self, effect: E) -> Self {
+    fn e_after(self, effect: E) -> Self {
         WithEffect {
             value: self.value,
-            effect: self.effect.after(effect),
+            effect: self.effect.e_after(effect),
         }
     }
 }
@@ -62,7 +62,7 @@ impl Pure for EffectClass {
     {
         WithEffect {
             value: a,
-            effect: E::pure(),
+            effect: E::e_pure(),
         }
     }
 }
@@ -77,7 +77,7 @@ impl ApplicativeSeq for EffectClass {
     {
         WithEffect {
             value: (ff.value)(fa.value),
-            effect: E::seq(ff.effect, fa.effect),
+            effect: E::e_seq(ff.effect, fa.effect),
         }
     }
 }
@@ -93,7 +93,7 @@ impl ApplicativeLA2 for EffectClass {
     {
         WithEffect {
             value: f(fa.value, fb.value),
-            effect: E::seq(fa.effect, fb.effect),
+            effect: E::e_seq(fa.effect, fb.effect),
         }
     }
 }
@@ -105,7 +105,7 @@ impl ApplicativeTuple for EffectClass {
     {
         WithEffect {
             value: (fa.value, fb.value),
-            effect: E::seq(fa.effect, fb.effect),
+            effect: E::e_seq(fa.effect, fb.effect),
         }
     }
 }
@@ -118,7 +118,7 @@ impl Applicative for EffectClass {
         drop(fa.value);
         WithEffect {
             value: fb.value,
-            effect: E::seq(fa.effect, fb.effect),
+            effect: E::e_seq(fa.effect, fb.effect),
         }
     }
 
@@ -129,7 +129,7 @@ impl Applicative for EffectClass {
         drop(fb.value);
         WithEffect {
             value: fa.value,
-            effect: E::seq(fa.effect, fb.effect),
+            effect: E::e_seq(fa.effect, fb.effect),
         }
     }
 }
@@ -142,17 +142,17 @@ impl Monad for EffectClass {
     where
         Self: 'a,
     {
-        f(fa.value).after(fa.effect)
+        f(fa.value).e_after(fa.effect)
     }
 
     fn iterate<'a, B: 'a>(mut f: impl Iterative<'a, T = Self, B = B>) -> Self::F<'a, B>
     where
         Self: 'a,
     {
-        let mut effect = E::pure();
+        let mut effect = E::e_pure();
         loop {
             let fa = f.next();
-            effect = fa.effect.after(effect);
+            effect = fa.effect.e_after(effect);
             match fa.value {
                 ControlFlow::Continue(next_f) => f = next_f,
                 ControlFlow::Break(b) => return WithEffect { value: b, effect },
@@ -165,7 +165,7 @@ impl Monad for EffectClass {
         Self::F<'a, A>: 'a,
         Self: 'a,
     {
-        ffa.value.after(ffa.effect)
+        ffa.value.e_after(ffa.effect)
     }
 }
 
diff --git a/src/std/collections/stack.rs b/src/std/collections/stack.rs
index 0f2e737..2ff17b8 100644
--- a/src/std/collections/stack.rs
+++ b/src/std/collections/stack.rs
@@ -272,12 +272,12 @@ mod tests {
         let traced = stack.clone().vec();
         assert_eq!(traced.length(), 0);
         assert_eq!(traced.width(), 0);
-        assert_eq!(format!("{}", traced.t), ".");
+        assert_eq!(format!("{}", traced.effect), ".");
         let stack: T = Rc::new(stack).trace()?;
         let traced = stack.clone().vec();
         assert_eq!(traced.length(), 3);
         assert_eq!(traced.width(), 1);
-        assert_eq!(format!("{}", traced.t), "( ? > ? > ? )");
+        assert_eq!(format!("{}", traced.effect), "( ? > ? > ? )");
         Ok(())
     }
 
diff --git a/src/std/tracing.rs b/src/std/tracing.rs
index 9d5f4a8..2fd8d61 100644
--- a/src/std/tracing.rs
+++ b/src/std/tracing.rs
@@ -22,8 +22,21 @@ pub use self::traced::*;
 pub struct TracedDiagnostic;
 
 /// Implementation of [`Monad`] for [Traced] objects.
-#[derive(CovariantFunctor)]
-pub struct TracedClass;
+pub type TracedClass = classes::effect::EffectClass;
+
+impl classes::effect::Effect for TraceBox {
+    fn e_pure() -> Self {
+        TraceBox::pure()
+    }
+
+    fn e_seq(lhs: Self, rhs: Self) -> Self {
+        TraceBox::parallel(lhs, rhs)
+    }
+
+    fn e_after(self, effect: Self) -> Self {
+        self.after(effect)
+    }
+}
 
 trait WithTrace: Sized {
     fn with_trace(self, t: TraceBox) -> Traced;
@@ -31,15 +44,18 @@ trait WithTrace: Sized {
 
 impl WithTrace for A {
     fn with_trace(self, t: TraceBox) -> Traced {
-        Traced { a: self, t }
+        Traced {
+            value: self,
+            effect: t,
+        }
     }
 }
 
 impl Traced {
     fn wrapped(self, event: &str) -> Self {
         Traced {
-            a: self.a,
-            t: self.t.wrapped(event),
+            value: self.value,
+            effect: self.effect.wrapped(event),
         }
     }
 
@@ -49,178 +65,24 @@ impl Traced {
 
     fn after(self, t: TraceBox) -> Self {
         Traced {
-            a: self.a,
-            t: self.t.after(t),
+            value: self.value,
+            effect: self.effect.after(t),
         }
     }
 
     fn before(self, t: TraceBox) -> Self {
         Traced {
-            a: self.a,
-            t: self.t.before(t),
+            value: self.value,
+            effect: self.effect.before(t),
         }
     }
 
     pub fn length(&self) -> usize {
-        self.t.length()
+        self.effect.length()
     }
 
     pub fn width(&self) -> usize {
-        self.t.width()
-    }
-}
-
-impl WeakFunctor for TracedClass {
-    type F<'a, A: 'a> = Traced;
-}
-
-impl Functor for TracedClass {
-    fn fmap<'a, A: 'a, B: 'a>(f: impl 'a + FnOnce(A) -> B, fa: Self::F<'a, A>) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        f(fa.a).with_trace(fa.t)
-    }
-
-    fn replace<'a, A: 'a, B: 'a>(fa: Self::F<'a, A>, b: B) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        b.with_trace(fa.t)
-    }
-
-    fn void<'a, A: 'a>(fa: Self::F<'a, A>) -> Self::F<'a, ()>
-    where
-        Self: 'a,
-    {
-        ().with_trace(fa.t)
-    }
-}
-
-impl Pure for TracedClass {
-    fn pure<'a, A: 'a>(a: A) -> Self::F<'a, A> {
-        a.with_trace(TraceBox::pure())
-    }
-}
-
-impl ApplicativeSeq for TracedClass {
-    fn seq<'a, A: 'a, B: 'a>(
-        ff: Self::F<'a, impl 'a + FnOnce(A) -> B>,
-        fa: Self::F<'a, A>,
-    ) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        (ff.a)(fa.a).with_trace(TraceBox::parallel(ff.t, fa.t))
-    }
-}
-
-impl ApplicativeLA2 for TracedClass {
-    fn la2<'a, A: 'a, B: 'a, C: 'a>(
-        f: impl 'a + FnOnce(A, B) -> C,
-        fa: Self::F<'a, A>,
-        fb: Self::F<'a, B>,
-    ) -> Self::F<'a, C>
-    where
-        Self: 'a,
-    {
-        f(fa.a, fb.a).with_trace(TraceBox::parallel(fa.t, fb.t))
-    }
-}
-
-impl ApplicativeTuple for TracedClass {
-    fn tuple<'a, A: 'a, B: 'a>((fa, fb): (Self::F<'a, A>, Self::F<'a, B>)) -> Self::F<'a, (A, B)>
-    where
-        Self: 'a,
-    {
-        (fa.a, fb.a).with_trace(TraceBox::parallel(fa.t, fb.t))
-    }
-}
-
-impl Applicative for TracedClass {
-    fn discard_first<'a, A: 'a, B: 'a>(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        fb.a.with_trace(TraceBox::parallel(fa.t, fb.t))
-    }
-
-    fn discard_second<'a, A: 'a, B: 'a>(fa: Self::F<'a, A>, fb: Self::F<'a, B>) -> Self::F<'a, A>
-    where
-        Self: 'a,
-    {
-        fa.a.with_trace(TraceBox::parallel(fa.t, fb.t))
-    }
-}
-
-impl Monad for TracedClass {
-    fn bind<'a, A: 'a, B: 'a>(
-        fa: Self::F<'a, A>,
-        f: impl 'a + FnOnce(A) -> Self::F<'a, B>,
-    ) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        f(fa.a).after(fa.t)
-    }
-
-    fn iterate_mut<'a, A: 'a, B: 'a>(
-        mut a: A,
-        mut f: impl 'a + FnMut(A) -> Self::F<'a, ControlFlow>,
-    ) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        let mut t = TraceBox::pure();
-        loop {
-            let fa = f(a);
-            t = fa.t.after(t);
-            match fa.a {
-                ControlFlow::Continue(next_a) => a = next_a,
-                ControlFlow::Break(b) => return b.with_trace(t),
-            }
-        }
-    }
-
-    fn iterate_argument<'a, A: 'a, B: 'a>(
-        mut a: A,
-        mut f: impl AIterative<'a, T = Self, A = A, B = B>,
-    ) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        let mut t = TraceBox::pure();
-        loop {
-            let fa = f.next(a);
-            t = fa.t.after(t);
-            match fa.a {
-                ControlFlow::Continue((next_a, next_f)) => (a, f) = (next_a, next_f),
-                ControlFlow::Break(b) => return b.with_trace(t),
-            }
-        }
-    }
-
-    fn iterate<'a, B: 'a>(mut f: impl Iterative<'a, T = Self, B = B>) -> Self::F<'a, B>
-    where
-        Self: 'a,
-    {
-        let mut t = TraceBox::pure();
-        loop {
-            let fa = f.next();
-            t = fa.t.after(t);
-            match fa.a {
-                ControlFlow::Continue(next_f) => f = next_f,
-                ControlFlow::Break(b) => return b.with_trace(t),
-            }
-        }
-    }
-
-    fn join<'a, A: 'a>(ffa: Self::F<'a, Self::F<'a, A>>) -> Self::F<'a, A>
-    where
-        Self::F<'a, A>: 'a,
-        Self: 'a,
-    {
-        ffa.a.after(ffa.t)
+        self.effect.width()
     }
 }
 
diff --git a/src/std/tracing/trace/render.rs b/src/std/tracing/trace/render.rs
index 1767f16..190d2de 100644
--- a/src/std/tracing/trace/render.rs
+++ b/src/std/tracing/trace/render.rs
@@ -40,7 +40,7 @@ impl Trace {
 
 impl Traced {
     pub fn render(&self) -> WithLengthAndWidth {
-        self.t.trace.render()
+        self.effect.trace.render()
     }
 }
 
diff --git a/src/std/tracing/traced.rs b/src/std/tracing/traced.rs
index ecb4b5d..45d8511 100644
--- a/src/std/tracing/traced.rs
+++ b/src/std/tracing/traced.rs
@@ -3,7 +3,4 @@ use super::*;
 /// Wrapper containing the value and the corresponding execution trace.
 ///
 /// For what the trace contains, see its rendered form, [`RenderedAny`].
-pub struct Traced {
-    pub a: A,
-    pub t: TraceBox,
-}
+pub type Traced = classes::effect::WithEffect;
diff --git a/src/testing/counted.rs b/src/testing/counted.rs
index f718c25..0a9c86f 100644
--- a/src/testing/counted.rs
+++ b/src/testing/counted.rs
@@ -25,15 +25,15 @@ impl Context for TestContextCounted {
 pub type CountedClass = classes::effect::EffectClass;
 
 impl classes::effect::Effect for usize {
-    fn pure() -> Self {
+    fn e_pure() -> Self {
         0
     }
 
-    fn seq(lhs: Self, rhs: Self) -> Self {
+    fn e_seq(lhs: Self, rhs: Self) -> Self {
         max(lhs, rhs)
     }
 
-    fn after(self, effect: Self) -> Self {
+    fn e_after(self, effect: Self) -> Self {
         self + effect
     }
 }