diff --git a/theories/finite.v b/theories/finite.v
index 0afae8a17b03f287a6645c21d8523dc28c63082d..9e58dcd6af54cfe9353255ea45e2a1f3d1d25520 100644
--- a/theories/finite.v
+++ b/theories/finite.v
@@ -220,15 +220,26 @@ Section enc_finite.
   Proof. unfold card. simpl. by rewrite fmap_length, seq_length. Qed.
 End enc_finite.
 
+Section surjective_finite.
+  Context `{Finite A, EqDecision B} (f : A → B).
+  Context `{!Surj (=) f}.
+
+  Program Instance surjective_finite: Finite B :=
+    {| enum := remove_dups (f <$> enum A) |}.
+  Next Obligation. apply NoDup_remove_dups. Qed.
+  Next Obligation.
+    intros y. rewrite elem_of_remove_dups, elem_of_list_fmap.
+    destruct (surj f y). eauto using elem_of_enum.
+  Qed.
+End surjective_finite.
+
 Section bijective_finite.
   Context `{Finite A, EqDecision B} (f : A → B) (g : B → A).
   Context `{!Inj (=) (=) f, !Cancel (=) f g}.
 
-  Program Instance bijective_finite: Finite B := {| enum := f <$> enum A |}.
-  Next Obligation. apply (NoDup_fmap_2 _), NoDup_enum. Qed.
-  Next Obligation.
-    intros y. rewrite elem_of_list_fmap. eauto using elem_of_enum.
-  Qed.
+  Global Instance bijective_finite: Finite B :=
+    let _ := cancel_surj (f:=f) (g:=g) in
+    surjective_finite f.
 End bijective_finite.
 
 Program Instance option_finite `{Finite A} : Finite (option A) :=