So to make sure I'm understanding correctly, you want to create your own statically typed scripting language for your game engine? Implementing your own statically-typed language is definitely a fun and worthwhile learning experience. You might find helpful the notes from my programming languages course, which is taught in Haskell:
https://hendrix-cs.github.io/csci360/
Having `Type` and `Value` ADTs to represent types and values makes sense. They often do correspond closely since there is often a canonical kind of value for each type, but they are not necessarily exactly the same.
You didn't mention an ADT for expressions/terms, i.e. syntax. Typically you will parse concrete syntax to produce a Term, and then you will typecheck a Term to make sure it has a valid Type. Then you can interpret the Term to produce a Value.
I am not sure what the point of TypedValue is. Typically, once you are finished with typechecking, you no longer need to keep track of types while interpreting.
-Brent