diff --git a/cannon/mipsevm/versions/detect_test.go b/cannon/mipsevm/versions/detect_test.go
index be849269fff9b528bf793cbf7a10397a79678443..bd1acd115eafe5a37b6cc88b7bfade315d4863d7 100644
--- a/cannon/mipsevm/versions/detect_test.go
+++ b/cannon/mipsevm/versions/detect_test.go
@@ -7,10 +7,12 @@ import (
 	"strconv"
 	"testing"
 
+	"github.com/stretchr/testify/require"
+
+	"github.com/ethereum-optimism/optimism/cannon/mipsevm/arch"
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded"
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded"
 	"github.com/ethereum-optimism/optimism/op-service/ioutil"
-	"github.com/stretchr/testify/require"
 )
 
 const statesPath = "testdata/states"
@@ -18,7 +20,7 @@ const statesPath = "testdata/states"
 //go:embed testdata/states
 var historicStates embed.FS
 
-func TestDetectVersion(t *testing.T) {
+func TestDetectVersion_fromFile(t *testing.T) {
 	testDetection := func(t *testing.T, version StateVersion, ext string) {
 		filename := strconv.Itoa(int(version)) + ext
 		dir := t.TempDir()
@@ -34,9 +36,6 @@ func TestDetectVersion(t *testing.T) {
 	// Iterate all known versions to ensure we have a test case to detect every state version
 	for _, version := range StateVersionTypes {
 		version := version
-		if version == VersionMultiThreaded64 {
-			t.Skip("TODO(#12205)")
-		}
 		t.Run(version.String(), func(t *testing.T) {
 			testDetection(t, version, ".bin.gz")
 		})
@@ -47,28 +46,38 @@ func TestDetectVersion(t *testing.T) {
 			})
 		}
 	}
+}
 
-	// Additionally, check that the latest supported versions write new states in a way that is detected correctly
-	t.Run("SingleThreadedBinary", func(t *testing.T) {
-		state, err := NewFromState(singlethreaded.CreateEmptyState())
-		require.NoError(t, err)
-		path := writeToFile(t, "state.bin.gz", state)
-		version, err := DetectVersion(path)
-		require.NoError(t, err)
-		require.Equal(t, VersionSingleThreaded2, version)
-	})
+// Check that the latest supported versions write new states in a way that is detected correctly
+func TestDetectVersion_singleThreadedBinary(t *testing.T) {
+	targetVersion := VersionSingleThreaded2
+	if !arch.IsMips32 {
+		t.Skip("Single-threaded states are not supported for 64-bit VMs")
+	}
 
-	t.Run("MultiThreadedBinary", func(t *testing.T) {
-		state, err := NewFromState(multithreaded.CreateEmptyState())
-		require.NoError(t, err)
-		path := writeToFile(t, "state.bin.gz", state)
-		version, err := DetectVersion(path)
-		require.NoError(t, err)
-		require.Equal(t, VersionMultiThreaded, version)
-	})
+	state, err := NewFromState(singlethreaded.CreateEmptyState())
+	require.NoError(t, err)
+	path := writeToFile(t, "state.bin.gz", state)
+	version, err := DetectVersion(path)
+	require.NoError(t, err)
+	require.Equal(t, targetVersion, version)
+}
+
+func TestDetectVersion_multiThreadedBinary(t *testing.T) {
+	targetVersion := VersionMultiThreaded
+	if !arch.IsMips32 {
+		targetVersion = VersionMultiThreaded64
+	}
+
+	state, err := NewFromState(multithreaded.CreateEmptyState())
+	require.NoError(t, err)
+	path := writeToFile(t, "state.bin.gz", state)
+	version, err := DetectVersion(path)
+	require.NoError(t, err)
+	require.Equal(t, targetVersion, version)
 }
 
-func TestDetectVersionInvalid(t *testing.T) {
+func TestDetectVersion_invalid(t *testing.T) {
 	t.Run("bad gzip", func(t *testing.T) {
 		dir := t.TempDir()
 		filename := "state.bin.gz"
diff --git a/cannon/mipsevm/versions/testdata/states/3.bin.gz b/cannon/mipsevm/versions/testdata/states/3.bin.gz
new file mode 100644
index 0000000000000000000000000000000000000000..b6f6728313a7d5f908724a9674dd68549270c623
Binary files /dev/null and b/cannon/mipsevm/versions/testdata/states/3.bin.gz differ