diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 22689c9c..cb3a6f55 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -69,7 +69,7 @@
 | idris |  |  |  | `idris2-lsp` |
 | iex | ✓ |  |  |  |
 | ini | ✓ |  |  |  |
-| java | ✓ | ✓ |  | `jdtls` |
+| java | ✓ | ✓ | ✓ | `jdtls` |
 | javascript | ✓ | ✓ | ✓ | `typescript-language-server` |
 | jsdoc | ✓ |  |  |  |
 | json | ✓ |  | ✓ | `vscode-json-language-server` |
diff --git a/languages.toml b/languages.toml
index 967bbea7..d35b835e 100644
--- a/languages.toml
+++ b/languages.toml
@@ -833,7 +833,7 @@ injection-regex = "java"
 file-types = ["java"]
 roots = ["pom.xml", "build.gradle", "build.gradle.kts"]
 language-servers = [ "jdtls" ]
-indent = { tab-width = 4, unit = "    " }
+indent = { tab-width = 2, unit = "  " }
 
 [[grammar]]
 name = "java"
diff --git a/runtime/queries/java/indents.scm b/runtime/queries/java/indents.scm
new file mode 100644
index 00000000..76e21861
--- /dev/null
+++ b/runtime/queries/java/indents.scm
@@ -0,0 +1,35 @@
+[
+  (class_body)
+  (enum_body)
+  (interface_body)
+  (constructor_body)
+  (annotation_type_body)
+  (module_body)
+  (block)
+  (switch_block)
+  (array_initializer)
+  (argument_list)
+  (formal_parameters)
+  (annotation_argument_list)
+  (element_value_array_initializer)
+] @indent
+
+[
+  "}"
+  ")"
+  "]"
+] @outdent
+
+; Single statement after if/while/for without brackets
+(if_statement
+  consequence: (_) @indent
+  (#not-kind-eq? @indent "block")
+  (#set! "scope" "all"))
+(while_statement
+  body: (_) @indent
+  (#not-kind-eq? @indent "block")
+  (#set! "scope" "all"))
+(for_statement
+  (_) @indent
+  (#not-kind-eq? @indent "block")
+  (#set! "scope" "all"))