diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py
index 7aa17c840a705ffb15a656a8f85befda42836781..a89f20932fab26b145aedef09e22bbf5dcd68358 100644
--- a/src/_zkapauthorizer/_storage_server.py
+++ b/src/_zkapauthorizer/_storage_server.py
@@ -101,6 +101,7 @@ from .storage_common import (
 SLOT_HEADER_SIZE = 468
 LEASE_TRAILER_SIZE = 4
 
+@attr.s
 class MorePassesRequired(Exception):
     """
     Storage operations fail with ``MorePassesRequired`` when they are not
@@ -112,9 +113,8 @@ class MorePassesRequired(Exception):
     ivar int required_count: The number of valid passes which must be
         presented for the operation to be authorized.
     """
-    def __init__(self, valid_count, required_count):
-        self.valid_count = valid_count
-        self.required_count = required_count
+    valid_count = attr.ib()
+    required_count = attr.ib()
 
     def __repr__(self):
         return "MorePassedRequired(valid_count={}, required_count={})".format(
diff --git a/src/_zkapauthorizer/tests/test_storage_server.py b/src/_zkapauthorizer/tests/test_storage_server.py
index 88ae5a1f1294bc0679787942f7432aa7e08d2291..fad28cb7dd29e032da565921a97b43397e69df8d 100644
--- a/src/_zkapauthorizer/tests/test_storage_server.py
+++ b/src/_zkapauthorizer/tests/test_storage_server.py
@@ -34,8 +34,6 @@ from testtools import (
 from testtools.matchers import (
     Equals,
     AfterPreprocessing,
-    MatchesStructure,
-    raises,
 )
 from hypothesis import (
     given,
@@ -70,6 +68,9 @@ from .common import (
 from .privacypass import (
     make_passes,
 )
+from .matchers import (
+    raises,
+)
 from .strategies import (
     zkaps,
     sizes,
@@ -231,8 +232,13 @@ class PassValidationTests(TestCase):
             result = mutable_write()
         except MorePassesRequired as e:
             self.assertThat(
-                e.required_count,
-                Equals(1),
+                e,
+                Equals(
+                    MorePassesRequired(
+                        valid_count=0,
+                        required_count=1,
+                    ),
+                ),
             )
         else:
             self.fail("expected MorePassesRequired, got {}".format(result))
@@ -329,9 +335,11 @@ class PassValidationTests(TestCase):
         except MorePassesRequired as e:
             self.assertThat(
                 e,
-                MatchesStructure(
-                    valid_count=Equals(0),
-                    required_count=Equals(1),
+                Equals(
+                    MorePassesRequired(
+                        valid_count=0,
+                        required_count=1,
+                    ),
                 ),
             )
         else:
@@ -423,9 +431,11 @@ class PassValidationTests(TestCase):
         except MorePassesRequired as e:
             self.assertThat(
                 e,
-                MatchesStructure(
-                    valid_count=Equals(len(passes)),
-                    required_count=Equals(required_count),
+                Equals(
+                    MorePassesRequired(
+                        valid_count=len(passes),
+                        required_count=required_count,
+                    ),
                 ),
             )
         else: