diff --git a/theories/tactics.v b/theories/tactics.v
index 9d9e5aabca407b0aa6a2f82b93a67bb1f836426c..8f63a7c7de2ceba0de1c4768512243b66450c43a 100644
--- a/theories/tactics.v
+++ b/theories/tactics.v
@@ -171,27 +171,29 @@ Ltac fold_classes :=
        repeat change (@alter _ _ _ (@alter _ _ _ F)) with (@alter _ _ _ F)
     end
   end.
-Ltac fold_classes_hyps :=
-  repeat match goal with
-  | _ : appcontext [ ?F ] |- _ =>
+Ltac fold_classes_hyps H :=
+  repeat match type of H with
+  | appcontext [ ?F ] =>
     progress match type of F with
     | FMap _ =>
-       change F with (@fmap _ F) in *;
-       repeat change (@fmap _ (@fmap _ F)) with (@fmap _ F) in *
+       change F with (@fmap _ F) in H;
+       repeat change (@fmap _ (@fmap _ F)) with (@fmap _ F) in H
     | MBind _ =>
-       change F with (@mbind _ F) in *;
-       repeat change (@mbind _ (@mbind _ F)) with (@mbind _ F) in *
+       change F with (@mbind _ F) in H;
+       repeat change (@mbind _ (@mbind _ F)) with (@mbind _ F) in H
     | OMap _ =>
-       change F with (@omap _ F) in *;
-       repeat change (@omap _ (@omap _ F)) with (@omap _ F) in *
+       change F with (@omap _ F) in H;
+       repeat change (@omap _ (@omap _ F)) with (@omap _ F) in H
     | Alter _ _ _ =>
-       change F with (@alter _ _ _ F) in *;
-       repeat change (@alter _ _ _ (@alter _ _ _ F)) with (@alter _ _ _ F) in *
+       change F with (@alter _ _ _ F) in H;
+       repeat change (@alter _ _ _ (@alter _ _ _ F)) with (@alter _ _ _ F) in H
     end
   end.
-Tactic Notation "csimpl" "in" "*" :=
-  try (progress simpl in *; fold_classes; fold_classes_hyps).
+Tactic Notation "csimpl" "in" hyp(H) :=
+  try (progress simpl in H; fold_classes_hyps H).
 Tactic Notation "csimpl" := try (progress simpl; fold_classes).
+Tactic Notation "csimpl" "in" "*" :=
+  repeat_on_hyps (fun H => csimpl in H); csimpl.
 
 Ltac simplify_equality := repeat
   match goal with