Start to enable int-warnings
diff --git a/build/premake5.lua b/build/premake5.lua
index 340807c..8749d62 100644
--- a/build/premake5.lua
+++ b/build/premake5.lua
@@ -66,7 +66,12 @@
 
     files {"../src/**.cpp"}
 
-    buildoptions {"-Wall", "-fno-exceptions", "-fno-rtti", "-Werror=format"}
+    buildoptions {
+        "-Wall", "-fno-exceptions",
+        "-fno-rtti",
+        "-Werror=format",
+        "-Wimplicit-int-conversion",
+    }
 
     filter {"system:macosx" }
         buildoptions {"-flto=full"}
diff --git a/include/rive/core/type_conversions.hpp b/include/rive/core/type_conversions.hpp
index f188413..f29221a 100644
--- a/include/rive/core/type_conversions.hpp
+++ b/include/rive/core/type_conversions.hpp
@@ -16,7 +16,7 @@
 }
 
 template <typename T> T castTo(intmax_t x) {
-    assert(sizeof(x) <= 4);    // don't use with 64bit types
+    assert(sizeof(T) <= 4);    // don't cast to 64bit types
     assert(fitsIn<T>(x));
     return static_cast<T>(x);
 }
diff --git a/src/shapes/mesh.cpp b/src/shapes/mesh.cpp
index fa8234f..e98d853 100644
--- a/src/shapes/mesh.cpp
+++ b/src/shapes/mesh.cpp
@@ -58,9 +58,7 @@
 
     BinaryReader reader(value);
     while (!reader.reachedEnd()) {
-        uint64_t index = reader.readVarUint64();
-        assert(index < std::numeric_limits<uint16_t>::max());
-        buffer->push_back(index);
+        buffer->push_back(reader.readVarUintAs<uint16_t>());
     }
     m_IndexBuffer = buffer;
 }
diff --git a/src/shapes/metrics_path.cpp b/src/shapes/metrics_path.cpp
index 29ae280..d6d5639 100644
--- a/src/shapes/metrics_path.cpp
+++ b/src/shapes/metrics_path.cpp
@@ -1,3 +1,4 @@
+#include "rive/core/type_conversions.hpp"
 #include "rive/shapes/metrics_path.hpp"
 #include "rive/renderer.hpp"
 
@@ -33,12 +34,15 @@
 }
 
 void MetricsPath::lineTo(float x, float y) {
-    m_Parts.push_back(PathPart(0, m_Points.size()));
+    // TODO: resize PathPart to allow for larger offsets
+    auto offset = castTo<uint8_t>(m_Points.size());
+    m_Parts.push_back(PathPart(0, offset));
     m_Points.emplace_back(Vec2D(x, y));
 }
 
 void MetricsPath::cubicTo(float ox, float oy, float ix, float iy, float x, float y) {
-    m_Parts.push_back(PathPart(1, m_Points.size()));
+    auto offset = castTo<uint8_t>(m_Points.size());
+    m_Parts.push_back(PathPart(1, offset));
     m_Points.emplace_back(Vec2D(ox, oy));
     m_Points.emplace_back(Vec2D(ix, iy));
     m_Points.emplace_back(Vec2D(x, y));
@@ -156,12 +160,12 @@
                 pen = &to;
 
                 int index = (int)m_CubicSegments.size();
-                part.type = index + 1;
+                part.type = castTo<uint8_t>(index + 1);
                 float partLength =
                     segmentCubic(from, fromOut, toIn, to, 0.0f, 0.0f, 1.0f, m_CubicSegments);
                 m_Lengths.push_back(partLength);
                 length += partLength;
-                part.numSegments = m_CubicSegments.size() - index;
+                part.numSegments = castTo<uint8_t>(m_CubicSegments.size() - index);
                 break;
             }
         }