diff --git a/CHANGELOG.md b/CHANGELOG.md
index 98b84084832e7b57e6707724e9a786c6a68a3df2..50ffa3a043cde1ce7dd97589c4bdd31b81d47ecd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 - `TileLayer::width` & `TileLayer::height` for ergonomic access of width/height.
 - `FiniteTileLayerData::get_tile_data`, `InfiniteTileLayerData::get_tile_data`.
+- `Default` derived implementation for `Loader` & `FilesystemResourceCache`
 
 ### Changed
 - Update `zstd` to `0.11.0`.
diff --git a/src/cache.rs b/src/cache.rs
index a650dd1d2d703bd82431c5fe691dd2928e5f2439..784654854cfd4701d40875507efd83af809df9ca 100644
--- a/src/cache.rs
+++ b/src/cache.rs
@@ -50,7 +50,7 @@ pub trait ResourceCache {
 }
 
 /// A cache that identifies resources by their path in the user's filesystem.
-#[derive(Debug)]
+#[derive(Debug, Default)]
 pub struct FilesystemResourceCache {
     tilesets: HashMap<ResourcePathBuf, Arc<Tileset>>,
 }
diff --git a/src/loader.rs b/src/loader.rs
index 939e1ff41364c71cbc05fa97743de3f2c3c652b6..35e4953d8c88b7b17a5f620577a7a023457362f0 100644
--- a/src/loader.rs
+++ b/src/loader.rs
@@ -11,7 +11,7 @@ use crate::{Error, FilesystemResourceCache, Map, ResourceCache, Result, Tileset}
 /// This type is used for loading operations because they require a [`ResourceCache`] for
 /// intermediate artifacts, so using a type for creation can ensure that the cache is reused if
 /// loading more than one object is required.
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, Default)]
 pub struct Loader<Cache: ResourceCache = FilesystemResourceCache> {
     cache: Cache,
 }
diff --git a/src/objects.rs b/src/objects.rs
index 910d3352b5fba4aa191ca2e5a6a13bcdeb60cc70..b2f82817c2804b77accc66c66db0c482b076b6c8 100644
--- a/src/objects.rs
+++ b/src/objects.rs
@@ -105,8 +105,8 @@ impl ObjectData {
         let height = h.unwrap_or(0f32);
         let rotation = r.unwrap_or(0f32);
         let id = id.unwrap_or(0u32);
-        let name = n.unwrap_or_else(String::new);
-        let obj_type = t.unwrap_or_else(String::new);
+        let name = n.unwrap_or_default();
+        let obj_type = t.unwrap_or_default();
         let mut shape = None;
         let mut properties = HashMap::new();