diff --git a/src/contracts/Cash.kt b/src/contracts/Cash.kt
index 9117fcc071..3073c36f1b 100644
--- a/src/contracts/Cash.kt
+++ b/src/contracts/Cash.kt
@@ -51,10 +51,7 @@ object Cash : Contract {
 
     sealed class Commands {
         /** A command proving ownership of some input states, the signature covers the output states. */
-        class Move : Command {
-            override fun equals(other: Any?) = other is Move
-            override fun hashCode() = 0
-        }
+        object Move : Command
 
         /**
          * A command stating that money has been withdrawn from the shared ledger and is now accounted for
@@ -181,7 +178,7 @@ object Cash : Contract {
         } else states
 
         // Finally, generate the commands. Pretend to sign here, real signatures aren't done yet.
-        val commands = keysUsed.map { VerifiedSigned(listOf(it), emptyList(), Commands.Move()) }
+        val commands = keysUsed.map { VerifiedSigned(listOf(it), emptyList(), Commands.Move) }
 
         return TransactionForTest(gathered.toArrayList(), outputs.toArrayList(), commands.toArrayList())
     }
diff --git a/src/contracts/ComedyPaper.kt b/src/contracts/ComedyPaper.kt
index bb385395c6..21a5871da4 100644
--- a/src/contracts/ComedyPaper.kt
+++ b/src/contracts/ComedyPaper.kt
@@ -37,8 +37,8 @@ object ComedyPaper : Contract {
     }
 
     sealed class Commands : Command {
-        class Move : Commands()
-        class Redeem : Commands()
+        object Move : Commands()
+        object Redeem : Commands()
     }
 
     override fun verify(tx: TransactionForVerification) {
diff --git a/src/core/ContractsDSL.kt b/src/core/ContractsDSL.kt
index d452d0a208..98fc8d6fc6 100644
--- a/src/core/ContractsDSL.kt
+++ b/src/core/ContractsDSL.kt
@@ -27,7 +27,6 @@ inline fun <reified T : Command> List<VerifiedSigned<Command>>.requireSingleComm
 } catch (e: NoSuchElementException) {
     throw IllegalStateException("Required ${T::class.qualifiedName} command")   // Better error message.
 }
-
 // endregion
 
 // region Currencies
diff --git a/src/core/Structures.kt b/src/core/Structures.kt
index 0f6fc51217..441374aa42 100644
--- a/src/core/Structures.kt
+++ b/src/core/Structures.kt
@@ -28,6 +28,7 @@ class Institution(
     override fun toString() = name
 }
 
+/** Marker interface for objects that represent commands */
 interface Command
 
 /** Provided as an input to a contract; converted to a [VerifiedSigned] by the platform before execution. */
diff --git a/tests/contracts/CashTests.kt b/tests/contracts/CashTests.kt
index a78d6e28d3..548615b240 100644
--- a/tests/contracts/CashTests.kt
+++ b/tests/contracts/CashTests.kt
@@ -38,7 +38,7 @@ class CashTests {
             }
             transaction {
                 output { outState }
-                arg(DUMMY_PUBKEY_2) { Cash.Commands.Move() }
+                arg(DUMMY_PUBKEY_2) { Cash.Commands.Move }
                 this `fails requirement` "the owning keys are the same as the signing keys"
             }
             transaction {
@@ -49,7 +49,7 @@ class CashTests {
             // Simple reallocation works.
             transaction {
                 output { outState }
-                arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+                arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
                 this.accepts()
             }
         }
@@ -70,7 +70,7 @@ class CashTests {
     fun testMergeSplit() {
         // Splitting value works.
         transaction {
-            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
             transaction {
                 input { inState }
                 for (i in 1..4) output { inState.copy(amount = inState.amount / 4) }
@@ -161,7 +161,7 @@ class CashTests {
 
             transaction {
                 arg(MEGA_CORP_KEY) { Cash.Commands.Exit(100.DOLLARS) }
-                arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+                arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
                 this `fails requirement` "the amounts balance"
             }
 
@@ -170,7 +170,7 @@ class CashTests {
                 this `fails requirement` "required move command"
 
                 transaction {
-                    arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+                    arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
                     this.accepts()
                 }
             }
@@ -183,7 +183,7 @@ class CashTests {
             output { inState.copy(amount = inState.amount - 200.DOLLARS).editInstitution(MINI_CORP) }
             output { inState.copy(amount = inState.amount - 200.DOLLARS) }
 
-            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
 
             this `fails requirement` "at issuer MegaCorp the amounts balance"
 
@@ -217,7 +217,7 @@ class CashTests {
             // This works.
             output { inState.copy(owner = DUMMY_PUBKEY_2) }
             output { inState.copy(owner = DUMMY_PUBKEY_2).editInstitution(MINI_CORP) }
-            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
             this.accepts()
         }
 
@@ -246,7 +246,7 @@ class CashTests {
                 transaction {
                     input { WALLET[0] }
                     output { WALLET[0].copy(owner = THEIR_PUBKEY_1) }
-                    arg(OUR_PUBKEY_1) { Cash.Commands.Move() }
+                    arg(OUR_PUBKEY_1) { Cash.Commands.Move }
                 },
                 Cash.craftSpend(100.DOLLARS, THEIR_PUBKEY_1, WALLET)
         )
@@ -259,7 +259,7 @@ class CashTests {
                     input { WALLET[0] }
                     output { WALLET[0].copy(owner = THEIR_PUBKEY_1, amount = 10.DOLLARS) }
                     output { WALLET[0].copy(owner = OUR_PUBKEY_1, amount = 90.DOLLARS) }
-                    arg(OUR_PUBKEY_1) { Cash.Commands.Move() }
+                    arg(OUR_PUBKEY_1) { Cash.Commands.Move }
                 },
                 Cash.craftSpend(10.DOLLARS, THEIR_PUBKEY_1, WALLET)
         )
@@ -272,7 +272,7 @@ class CashTests {
                     input { WALLET[0] }
                     input { WALLET[1] }
                     output { WALLET[0].copy(owner = THEIR_PUBKEY_1, amount = 500.DOLLARS) }
-                    arg(OUR_PUBKEY_1) { Cash.Commands.Move() }
+                    arg(OUR_PUBKEY_1) { Cash.Commands.Move }
                 },
                 Cash.craftSpend(500.DOLLARS, THEIR_PUBKEY_1, WALLET)
         )
@@ -287,7 +287,7 @@ class CashTests {
                     input { WALLET[2] }
                     output { WALLET[0].copy(owner = THEIR_PUBKEY_1, amount = 500.DOLLARS) }
                     output { WALLET[2].copy(owner = THEIR_PUBKEY_1) }
-                    arg(OUR_PUBKEY_1) { Cash.Commands.Move() }
+                    arg(OUR_PUBKEY_1) { Cash.Commands.Move }
                 },
                 Cash.craftSpend(580.DOLLARS, THEIR_PUBKEY_1, WALLET)
         )
diff --git a/tests/contracts/ComedyPaperTests.kt b/tests/contracts/ComedyPaperTests.kt
index 00fb615d8a..491b0959a1 100644
--- a/tests/contracts/ComedyPaperTests.kt
+++ b/tests/contracts/ComedyPaperTests.kt
@@ -30,22 +30,22 @@ class ComedyPaperTests {
             this.rejects()
 
             transaction {
-                arg(DUMMY_PUBKEY_2) { ComedyPaper.Commands.Move() }
+                arg(DUMMY_PUBKEY_2) { ComedyPaper.Commands.Move }
                 this `fails requirement` "is signed by the owner"
             }
 
-            arg(DUMMY_PUBKEY_1) { ComedyPaper.Commands.Move() }
-            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+            arg(DUMMY_PUBKEY_1) { ComedyPaper.Commands.Move }
+            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
             this.accepts()
         }.chain("a") {
-            arg(DUMMY_PUBKEY_2, MINI_CORP_KEY) { ComedyPaper.Commands.Redeem() }
+            arg(DUMMY_PUBKEY_2, MINI_CORP_KEY) { ComedyPaper.Commands.Redeem }
 
             // No cash output, can't redeem like that!
             this.rejects("no cash being redeemed")
 
             input { CASH_3 }
             output { CASH_2 }
-            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move() }
+            arg(DUMMY_PUBKEY_1) { Cash.Commands.Move }
 
             // Time passes, but not enough. An attempt to redeem is made.
             this.rejects("must have matured")