Use the real Version type from semver crate
diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml
index 66c1a7e..1f0ff42 100644
--- a/codegen/Cargo.toml
+++ b/codegen/Cargo.toml
@@ -17,6 +17,7 @@
 serde = { version = "1.0.88", features = ["derive"] }
 serde_json = "1.0.38"
 toml = "0.4.10"
+semver = { version = "0.9", features = ["serde"] }
 
 [workspace]
 # Prefer that `cargo clean` in syn's directory does not require a rebuild of
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
index cf41b5a..074e50d 100644
--- a/codegen/src/types.rs
+++ b/codegen/src/types.rs
@@ -1,4 +1,5 @@
 use indexmap::IndexMap;
+use semver::Version;
 use serde::{Deserialize, Deserializer, Serialize};
 
 use std::collections::{BTreeMap, BTreeSet};
@@ -6,7 +7,7 @@
 #[derive(Debug, PartialEq, Serialize, Deserialize)]
 pub struct Definitions {
     /// The Syn version used to generate the introspection file.
-    pub version: String,
+    pub version: Version,
     pub types: Vec<Node>,
     pub tokens: BTreeMap<String, String>,
 }
diff --git a/codegen/src/version.rs b/codegen/src/version.rs
index c3536c1..fab7907 100644
--- a/codegen/src/version.rs
+++ b/codegen/src/version.rs
@@ -1,9 +1,10 @@
+use semver::Version;
 use serde::Deserialize;
 
 use std::fs;
 use std::path::Path;
 
-pub fn get() -> String {
+pub fn get() -> Version {
     let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
     let syn_cargo_toml = codegen_root.join("../Cargo.toml");
     let manifest = fs::read_to_string(syn_cargo_toml).unwrap();
@@ -18,5 +19,5 @@
 
 #[derive(Debug, Deserialize)]
 struct Package {
-    version: String,
+    version: Version,
 }