diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index 5c9fcbf10..e9ada1fcd 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -417,6 +417,7 @@ impl fmt::Display for Whitespace {
 
 /// Location in input string
 #[derive(Eq, PartialEq, Hash, Clone, Copy, Ord, PartialOrd)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 pub struct Location {
     /// Line number, starting from 1
     pub line: u64,
@@ -456,6 +457,7 @@ impl From<(u64, u64)> for Location {
 }
 
 #[derive(Eq, PartialEq, Hash, Clone, PartialOrd, Ord, Copy)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 pub struct Span {
     pub start: Location,
     pub end: Location,
@@ -504,6 +506,7 @@ impl Span {
 
 /// A [Token] with [Location] attached to it
 #[derive(Debug, Eq, Hash, Clone)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 pub struct TokenWithLocation {
     pub token: Token,
     pub span: Span,