diff --git a/src/shared/units/Angle.h b/src/shared/units/Angle.h
index 411296dfc0b60d66f1ad737d1ffad3bc0445d4e9..dbc26b1fcd6a7adcb1bab318ad91543fb413f897 100644
--- a/src/shared/units/Angle.h
+++ b/src/shared/units/Angle.h
@@ -34,10 +34,7 @@ namespace Angle
 {
 
 template <class Ratio = std::ratio<1>>
-class Angle : public Unit<Ratio>
-{
-    using Unit<Ratio>::Unit;
-};
+using Angle = Unit<UnitKind::Angle, Ratio>;
 
 using Degree = Angle<>;  // Angle in degrees
 using Radian =           // Angle in radians
diff --git a/src/shared/units/Units.h b/src/shared/units/Units.h
index dd080649b8b0d8f79069a817e293c7aeed45406a..20499a3b62c8ff55c840c8c1e70e3f653d9d483b 100644
--- a/src/shared/units/Units.h
+++ b/src/shared/units/Units.h
@@ -32,14 +32,20 @@ namespace Boardcore
 namespace Units
 {
 
-template <class Ratio = std::ratio<1>>
+enum class UnitKind
+{
+    Angle,
+    Length
+};
+
+template <UnitKind Kind, class Ratio = std::ratio<1>>
 // Base class to implement custom measurement units logic.
 class Unit
 {
 public:
     Unit(float val) : _value(val){};
     template <class FromRatio>
-    constexpr explicit Unit(Unit<FromRatio> const &from)
+    constexpr explicit Unit(Unit<Kind, FromRatio> const &from)
         : _value(from.template value<Ratio>())
     {
     }
@@ -67,10 +73,11 @@ private:
 };
 
 // Sum, Subtraction, Multiplication, Division
-template <class DerivedUnit>
-constexpr auto operator+(const DerivedUnit &lhs, const DerivedUnit &rhs)
+template <UnitKind Kind, class Ratio>
+constexpr auto operator+(const Unit<Kind, Ratio> &lhs,
+                         const Unit<Kind, Ratio> &rhs)
 {
-    return DerivedUnit(lhs.template value() + rhs.template value());
+    return Unit(lhs.template value() + rhs.template value());
 }
 
 template <class DerivedUnit>