diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go
index 674ae1dd7..197d626a4 100644
--- a/modules/git/repo_attribute.go
+++ b/modules/git/repo_attribute.go
@@ -336,10 +336,3 @@ func attributeToBool(attr map[string]string, name string) optional.Option[bool]
 	}
 	return optional.None[bool]()
 }
-
-func attributeToString(attr map[string]string, name string) optional.Option[string] {
-	if value, has := attr[name]; has && value != "unspecified" {
-		return optional.Some(value)
-	}
-	return optional.None[string]()
-}
diff --git a/modules/git/repo_language_stats_gogit.go b/modules/git/repo_language_stats_gogit.go
index da0b209b3..1276ce1a4 100644
--- a/modules/git/repo_language_stats_gogit.go
+++ b/modules/git/repo_language_stats_gogit.go
@@ -138,21 +138,22 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
 		}
 
 		included, checked := includedLanguage[language]
+		langType := enry.GetLanguageType(language)
 		if !checked {
-			langtype := enry.GetLanguageType(language)
-			included = langtype == enry.Programming || langtype == enry.Markup
-			if !included {
-				if isTrue(isDetectable) {
-					included = true
-				} else {
-					return nil
-				}
+			included = langType == enry.Programming || langType == enry.Markup
+			if !included && (isTrue(isDetectable) || (langType == enry.Prose && isFalse(isDocumentation))) {
+				included = true
 			}
 			includedLanguage[language] = included
 		}
 		if included {
 			sizes[language] += f.Size
 		} else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) {
+			// Only consider Programming or Markup languages as fallback
+			if !(langType == enry.Programming || langType == enry.Markup) {
+				return nil
+			}
+
 			firstExcludedLanguage = language
 			firstExcludedLanguageSize += f.Size
 		}
diff --git a/modules/git/repo_language_stats_nogogit.go b/modules/git/repo_language_stats_nogogit.go
index 44235c0a4..b313e2298 100644
--- a/modules/git/repo_language_stats_nogogit.go
+++ b/modules/git/repo_language_stats_nogogit.go
@@ -197,25 +197,24 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
 		}
 
 		included, checked := includedLanguage[language]
+		langType := enry.GetLanguageType(language)
 		if !checked {
-			langType := enry.GetLanguageType(language)
 			included = langType == enry.Programming || langType == enry.Markup
-			if !included {
-				if isTrue(isDetectable) {
-					included = true
-				} else {
-					continue
-				}
+			if !included && (isTrue(isDetectable) || (langType == enry.Prose && isFalse(isDocumentation))) {
+				included = true
 			}
 			includedLanguage[language] = included
 		}
 		if included {
 			sizes[language] += f.Size()
 		} else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) {
+			// Only consider Programming or Markup languages as fallback
+			if !(langType == enry.Programming || langType == enry.Markup) {
+				continue
+			}
 			firstExcludedLanguage = language
 			firstExcludedLanguageSize += f.Size()
 		}
-		continue
 	}
 
 	// If there are no included languages add the first excluded language
diff --git a/tests/integration/linguist_test.go b/tests/integration/linguist_test.go
index 12f12f5cb..4c8ae4bdb 100644
--- a/tests/integration/linguist_test.go
+++ b/tests/integration/linguist_test.go
@@ -251,5 +251,18 @@ func TestLinguistSupport(t *testing.T) {
 				assertFileLanguage(t, "/blame/branch/main/foo.c", "Bash")
 			})
 		})
+
+		// 10. Marking a file as non-documentation
+		t.Run("linguist-documentation=false", func(t *testing.T) {
+			defer tests.PrintCurrentTest(t)()
+
+			repo, sha, f := prep(t, "README.md linguist-documentation=false\n")
+			defer f()
+
+			langs := getFreshLanguageStats(t, repo, sha)
+			assert.Len(t, langs, 2)
+			assert.Equal(t, "Markdown", langs[0].Language)
+			assert.Equal(t, "C", langs[1].Language)
+		})
 	})
 }