We propose a multi-objective optimization algorithm for optimal energy storage by residential customers using Li-Ion batteries. Our goal is to quantify the benefits of optimal energy storage to solar customers whose electricity bills consist of both Time of Use charges ($/kWh, with different rates for on-peak and off-peak hours) and demand charges ($/kW, proportional to the peak rate of consumption in a month). We first define our energy storage optimization problem as minimization of the monthly electricity bill subject to certain constraints on the energy level and the charging/discharging rate of the battery, while accounting for battery's degradation due to cycling and depth of discharge. We solve this problem by constructing a sequence of parameterized multi-objective dynamic programs whose sets of non-dominated solutions are guaranteed to contain an optimal solution to our energy storage problem. Unlike the standard formulation of our energy storage problem, each of the parameterized optimization problems satisfy the principle of optimality - hence can be solved using standard dynamic programming algorithms. Our numerical case studies on a wide range of load profiles and various pricing plans show that optimal energy storage using Tesla's Powerwall battery can reduce the monthly electricity bill by up to 52% relative to the case where no energy storage is used.