diff --git a/crates/native/src/desktop_entry.rs b/crates/native/src/desktop_entry.rs
--- a/crates/native/src/desktop_entry.rs
+++ b/crates/native/src/desktop_entry.rs
@@ -181,3 +181,13 @@ mod tests {
         assert_eq!(exec_program("[Desktop Entry]\nName=x\n"), None);
     }
 }
+
+/// Extracts the `Name=` field from a desktop entry.
+pub fn name(content: &str) -> Option<String> {
+    for line in content.lines() {
+        if let Some(value) = line.strip_prefix("Name=") {
+            return Some(value.to_string());
+        }
+    }
+    None
+}
diff --git a/crates/native/src/install.rs b/crates/native/src/install.rs
--- a/crates/native/src/install.rs
+++ b/crates/native/src/install.rs
@@ -1060,6 +1060,7 @@ pub(crate) mod linux {
                 crate::desktop_entry::is_ours(&old)
                     || crate::desktop_entry::exec_program(&old)
                         .is_some_and(|p| Path::new(&p) == appimage || replaced.iter().any(|r| r == Path::new(&p)))
+                    || crate::desktop_entry::name(&old).is_some_and(|n| n == app.name)
             }
             Err(_) => !desktop.exists(),
         };
