diff --git a/android/prebuilt.go b/android/prebuilt.go
index 269ad5d..9f4df28 100644
--- a/android/prebuilt.go
+++ b/android/prebuilt.go
@@ -225,7 +225,7 @@
 // PrebuiltSourceDepsMutator adds dependencies to the prebuilt module from the
 // corresponding source module, if one exists for the same variant.
 func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) {
-	if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Enabled() && m.Prebuilt() != nil {
+	if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil {
 		p := m.Prebuilt()
 		if !p.properties.PrebuiltRenamedToSource {
 			name := m.base().BaseModuleName()
diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go
index 6c3cd9e..8029b85 100644
--- a/android/prebuilt_test.go
+++ b/android/prebuilt_test.go
@@ -22,10 +22,9 @@
 )
 
 var prebuiltsTests = []struct {
-	name      string
-	replaceBp bool // modules is added to default bp boilerplate if false.
-	modules   string
-	prebuilt  []OsType
+	name     string
+	modules  string
+	prebuilt []OsClass
 }{
 	{
 		name: "no prebuilt",
@@ -43,7 +42,7 @@
 				prefer: false,
 				srcs: ["prebuilt_file"],
 			}`,
-		prebuilt: []OsType{Android, BuildOs},
+		prebuilt: []OsClass{Device, Host},
 	},
 	{
 		name: "no source prebuilt preferred",
@@ -53,7 +52,7 @@
 				prefer: true,
 				srcs: ["prebuilt_file"],
 			}`,
-		prebuilt: []OsType{Android, BuildOs},
+		prebuilt: []OsClass{Device, Host},
 	},
 	{
 		name: "prebuilt not preferred",
@@ -81,7 +80,7 @@
 				prefer: true,
 				srcs: ["prebuilt_file"],
 			}`,
-		prebuilt: []OsType{Android, BuildOs},
+		prebuilt: []OsClass{Device, Host},
 	},
 	{
 		name: "prebuilt no file not preferred",
@@ -121,7 +120,7 @@
 				prefer: true,
 				srcs: [":fg"],
 			}`,
-		prebuilt: []OsType{Android, BuildOs},
+		prebuilt: []OsClass{Device, Host},
 	},
 	{
 		name: "prebuilt module for device only",
@@ -136,7 +135,7 @@
 				prefer: true,
 				srcs: ["prebuilt_file"],
 			}`,
-		prebuilt: []OsType{Android},
+		prebuilt: []OsClass{Device},
 	},
 	{
 		name: "prebuilt file for host only",
@@ -154,7 +153,7 @@
 					},
 				},
 			}`,
-		prebuilt: []OsType{BuildOs},
+		prebuilt: []OsClass{Host},
 	},
 	{
 		name: "prebuilt override not preferred",
@@ -192,72 +191,7 @@
 				prefer: true,
 				srcs: ["prebuilt_file"],
 			}`,
-		prebuilt: []OsType{Android, BuildOs},
-	},
-	{
-		name:      "prebuilt including default-disabled OS",
-		replaceBp: true,
-		modules: `
-			source {
-				name: "foo",
-				deps: [":bar"],
-				target: {
-					windows: {
-						enabled: true,
-					},
-				},
-			}
-
-			source {
-				name: "bar",
-				target: {
-					windows: {
-						enabled: true,
-					},
-				},
-			}
-
-			prebuilt {
-				name: "bar",
-				prefer: true,
-				srcs: ["prebuilt_file"],
-				target: {
-					windows: {
-						enabled: true,
-					},
-				},
-			}`,
-		prebuilt: []OsType{Android, BuildOs, Windows},
-	},
-	{
-		name:      "fall back to source for default-disabled OS",
-		replaceBp: true,
-		modules: `
-			source {
-				name: "foo",
-				deps: [":bar"],
-				target: {
-					windows: {
-						enabled: true,
-					},
-				},
-			}
-
-			source {
-				name: "bar",
-				target: {
-					windows: {
-						enabled: true,
-					},
-				},
-			}
-
-			prebuilt {
-				name: "bar",
-				prefer: true,
-				srcs: ["prebuilt_file"],
-			}`,
-		prebuilt: []OsType{Android, BuildOs},
+		prebuilt: []OsClass{Device, Host},
 	},
 }
 
@@ -269,25 +203,14 @@
 
 	for _, test := range prebuiltsTests {
 		t.Run(test.name, func(t *testing.T) {
-			bp := test.modules
-			if !test.replaceBp {
-				bp = bp + `
-					source {
-						name: "foo",
-						deps: [":bar"],
-					}`
-			}
+			bp := `
+				source {
+					name: "foo",
+					deps: [":bar"],
+				}
+				` + test.modules
 			config := TestArchConfig(buildDir, nil, bp, fs)
 
-			// Add windows to the target list to test the logic when a variant is
-			// disabled by default.
-			if !Windows.DefaultDisabled {
-				t.Errorf("windows is assumed to be disabled by default")
-			}
-			config.config.Targets[Windows] = []Target{
-				{Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", ""},
-			}
-
 			ctx := NewTestArchContext()
 			registerTestPrebuiltBuildComponents(ctx)
 			ctx.RegisterModuleType("filegroup", FileGroupFactory)
@@ -300,7 +223,7 @@
 
 			for _, variant := range ctx.ModuleVariantsForTests("foo") {
 				foo := ctx.ModuleForTests("foo", variant)
-				t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
+				t.Run(foo.Module().Target().Os.Class.String(), func(t *testing.T) {
 					var dependsOnSourceModule, dependsOnPrebuiltModule bool
 					ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
 						if _, ok := m.(*sourceModule); ok {
@@ -314,38 +237,26 @@
 						}
 					})
 
-					moduleIsDisabled := !foo.Module().Enabled()
 					deps := foo.Module().(*sourceModule).deps
-					if moduleIsDisabled {
-						if len(deps) > 0 {
-							t.Errorf("disabled module got deps: %v", deps)
-						}
-					} else {
-						if len(deps) != 1 {
-							t.Errorf("deps does not have single path, but is %v", deps)
-						}
+					if deps == nil || len(deps) != 1 {
+						t.Errorf("deps does not have single path, but is %v", deps)
 					}
-
 					var usingSourceFile, usingPrebuiltFile bool
-					if len(deps) > 0 && deps[0].String() == "source_file" {
+					if deps[0].String() == "source_file" {
 						usingSourceFile = true
 					}
-					if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
+					if deps[0].String() == "prebuilt_file" {
 						usingPrebuiltFile = true
 					}
 
 					prebuilt := false
 					for _, os := range test.prebuilt {
-						if os == foo.Module().Target().Os {
+						if os == foo.Module().Target().Os.Class {
 							prebuilt = true
 						}
 					}
 
 					if prebuilt {
-						if moduleIsDisabled {
-							t.Errorf("dependent module for prebuilt is disabled")
-						}
-
 						if !dependsOnPrebuiltModule {
 							t.Errorf("doesn't depend on prebuilt module")
 						}
@@ -359,7 +270,7 @@
 						if usingSourceFile {
 							t.Errorf("using source_file")
 						}
-					} else if !moduleIsDisabled {
+					} else {
 						if dependsOnPrebuiltModule {
 							t.Errorf("depends on prebuilt module")
 						}
