Whole program analysis does not require breaking changes (unless it did not compile because there were known broken paths, which is a good thing to fix anyway).
However, making a new language on top of the beam could be type safe all the way down until it compiles to the beam itself. It would then be ‘safe’ internally except for when you call beam-native things (in which case type-safe wrappers should be made).
Something like https://github.com/j14159/mlfe would be a good start.
EDIT: /me loves strongly typed languages (though HKT’s are a necessity), catching things at compile-time is always better than run-time. But even Elixir would work if it added whole-program analysis (which admittedly would be basically re-creating dialyzer in the compiler, to examine everything included, ever).