diff --git a/ext/MeasurementsSymbolicsExt.jl b/ext/MeasurementsSymbolicsExt.jl
index 575ae0c0..690a4e2d 100644
--- a/ext/MeasurementsSymbolicsExt.jl
+++ b/ext/MeasurementsSymbolicsExt.jl
@@ -30,4 +30,6 @@ Measurements._is_symbolic(::Symbolics.Num) = true
 
 Measurements.measurement(val::Symbolics.Num) = Measurements._measurement(val)
 
+Measurements.measurement(val::Symbolics.Num, err::Symbolics.Num) = Measurements._measurement(val, err)
+
 end
diff --git a/src/Measurements.jl b/src/Measurements.jl
index 66953477..0a047d79 100644
--- a/src/Measurements.jl
+++ b/src/Measurements.jl
@@ -95,10 +95,7 @@ end
 measurement(val::AbstractFloat) = _measurement(val)
 measurement(val::Real) = measurement(float(val))
 
-function measurement(val::T, err::T) where {T<:Real}
-    if !(T<:AbstractFloat) && !_is_symbolic(val)
-        return measurement(promote(float(val), float(err))...)
-    end
+function _measurement(val::T, err::T) where {T<:Real}
     newder = empty_der2(val)
     if iszero(err)
         Measurement{T}(val, err, UInt64(0), newder)
@@ -107,8 +104,12 @@ function measurement(val::T, err::T) where {T<:Real}
         return Measurement{T}(val, err, tag, Derivatives(newder, (val, err, tag)=>one(T)))
     end
 end
-measurement(val::Real, err::Real) = measurement(promote(val, err)...)
+measurement(val::T, err::T) where {T<:AbstractFloat} = _measurement(val, err)
+measurement(val::T, err::T) where {T<:Real} = measurement(promote(float(val), float(err))...)
+measurement(val::V, err::E) where {V<:Real, E<:Real} = measurement(promote(val, err)...)
+
 measurement(::Missing, ::Union{Real,Missing} = missing) = missing
+
 const ± = measurement
 
 """