The biggest problem of solidity is its inconsistent semantics and unexpected side effects of certain operations.
Examples are type conversion, arithmetic operators, fallback function, different ways of calling other contracts or libraries, variable visibility and access ...
And of course a key point is to understand what it means that your code will be executed on the blockchain.
In this sense, the solution won't be to have a non-Turing complete limited language. The solution will be to have a very strict and logical language in which all side effects are easily foreseen and the language semantics makes more sense in a distributed ledger context.