diff --git a/lib/eye/dsl/main.rb b/lib/eye/dsl/main.rb
index <HASH>..<HASH> 100644
--- a/lib/eye/dsl/main.rb
+++ b/lib/eye/dsl/main.rb
@@ -41,7 +41,7 @@ module Eye::Dsl::Main
 
     opts = Eye::Dsl::ConfigOpts.new
     opts.instance_eval(&block)
-    @parsed_config.settings.merge!(opts.config)
+    Eye::Utils.deep_merge!(@parsed_config.settings, opts.config)
 
     Eye::Dsl.debug '<= config'
   end
diff --git a/lib/eye/dsl/process_opts.rb b/lib/eye/dsl/process_opts.rb
index <HASH>..<HASH> 100644
--- a/lib/eye/dsl/process_opts.rb
+++ b/lib/eye/dsl/process_opts.rb
@@ -4,7 +4,7 @@ class Eye::Dsl::ProcessOpts < Eye::Dsl::Opts
     opts = Eye::Dsl::ChildProcessOpts.new
     opts.instance_eval(&block) if block
     @config[:monitor_children] ||= {}
-    @config[:monitor_children].merge!(opts.config)
+    Eye::Utils.deep_merge!(@config[:monitor_children], opts.config)
   end
 
   alias xmonitor_children nop
deep merge in other places in dsl