diff --git a/java/java.go b/java/java.go
index adb3d7b..195a078 100644
--- a/java/java.go
+++ b/java/java.go
@@ -216,35 +216,45 @@
 
 	ctx.VisitDirectDeps(func(module blueprint.Module) {
 		otherName := ctx.OtherModuleName(module)
-		if javaDep, ok := module.(JavaDependency); ok {
-			if otherName == j.BootClasspath(ctx) {
-				bootClasspath = android.OptionalPathForPath(javaDep.ClasspathFile())
-			} else if inList(otherName, config.DefaultLibraries) {
-				classpath = append(classpath, javaDep.ClasspathFile())
-			} else if inList(otherName, j.properties.Java_libs) {
-				classpath = append(classpath, javaDep.ClasspathFile())
-			} else if inList(otherName, j.properties.Java_static_libs) {
-				classpath = append(classpath, javaDep.ClasspathFile())
-				classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...)
-				resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...)
-			} else if otherName == "framework-res" {
-				if ctx.ModuleName() == "framework" {
-					// framework.jar has a one-off dependency on the R.java and Manifest.java files
-					// generated by framework-res.apk
-					srcFileLists = append(srcFileLists, module.(*AndroidApp).aaptJavaFileList)
-				}
-			} else {
-				panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
+		tag := ctx.OtherModuleDependencyTag(module)
+
+		javaDep, _ := module.(JavaDependency)
+		if javaDep == nil {
+			switch tag {
+			case android.DefaultsDepTag, android.SourceDepTag:
+			default:
+				ctx.ModuleErrorf("depends on non-java module %q", otherName)
 			}
-			aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...)
-			if sdkDep, ok := module.(sdkDependency); ok {
-				if sdkDep.AidlPreprocessed().Valid() {
-					if aidlPreprocess.Valid() {
-						ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
-							aidlPreprocess, sdkDep.AidlPreprocessed())
-					} else {
-						aidlPreprocess = sdkDep.AidlPreprocessed()
-					}
+			return
+		}
+
+		if otherName == j.BootClasspath(ctx) {
+			bootClasspath = android.OptionalPathForPath(javaDep.ClasspathFile())
+		} else if inList(otherName, config.DefaultLibraries) {
+			classpath = append(classpath, javaDep.ClasspathFile())
+		} else if inList(otherName, j.properties.Java_libs) {
+			classpath = append(classpath, javaDep.ClasspathFile())
+		} else if inList(otherName, j.properties.Java_static_libs) {
+			classpath = append(classpath, javaDep.ClasspathFile())
+			classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...)
+			resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...)
+		} else if otherName == "framework-res" {
+			if ctx.ModuleName() == "framework" {
+				// framework.jar has a one-off dependency on the R.java and Manifest.java files
+				// generated by framework-res.apk
+				srcFileLists = append(srcFileLists, module.(*AndroidApp).aaptJavaFileList)
+			}
+		} else {
+			panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
+		}
+		aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...)
+		if sdkDep, ok := module.(sdkDependency); ok {
+			if sdkDep.AidlPreprocessed().Valid() {
+				if aidlPreprocess.Valid() {
+					ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
+						aidlPreprocess, sdkDep.AidlPreprocessed())
+				} else {
+					aidlPreprocess = sdkDep.AidlPreprocessed()
 				}
 			}
 		}
@@ -500,19 +510,24 @@
 // Java prebuilts
 //
 
-type javaPrebuiltProperties struct {
+type JavaPrebuiltProperties struct {
 	Srcs []string
 }
 
 type JavaPrebuilt struct {
 	android.ModuleBase
+	prebuilt android.Prebuilt
 
-	properties javaPrebuiltProperties
+	properties JavaPrebuiltProperties
 
 	classpathFile                   android.Path
 	classJarSpecs, resourceJarSpecs []jarSpec
 }
 
+func (j *JavaPrebuilt) Prebuilt() *android.Prebuilt {
+	return &j.prebuilt
+}
+
 func (j *JavaPrebuilt) DepsMutator(ctx android.BottomUpMutatorContext) {
 }
 
@@ -552,7 +567,9 @@
 func JavaPrebuiltFactory() android.Module {
 	module := &JavaPrebuilt{}
 
-	module.AddProperties(&module.properties)
+	module.AddProperties(
+		&module.properties,
+		&module.prebuilt.Properties)
 
 	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
 	return module
